为什么是数字||布尔人数字

  • 本文关键字:数字 布尔人 elixir
  • 更新时间 :
  • 英文 :


我是长生不老药的新手,但我找不到问题的答案。这是我输入iex的一些示例。

expression   result
9 || true    9
true || 9    true
9 && true    true
true && 9    9

因此,当有一个||时,它将评估为第一个参数,而&&则在一个参数不是布尔时持续。||&&如何实现?他们为什么要返回这些结果?

这是短路布尔逻辑的上下文中的常见语言设施。抛出一些有用的示例情况的伪代码:

need_a_number() && calculate_number() # do the expensive calculate_number() call, and evaluate to
                                      # its result, only if need_a_number() is truthy.
get_a_string() || "default string"  # returns "default_string" if get_a_string() is falsey

如果您的&&||仅返回布尔值,则您将无法在单个操作中进行分支和计算。

虽然查尔斯的回答是正确的,但并没有讲述整个故事。总体而言,长生不老药有2组不同的操作员来处理"布尔值"值:

  • &&||-这些作品在所有类型上,从字面上看:

    case left do # equivalent to left && right
      x when x in [nil, false] -> x
      _ -> right
    end
    
  • andor仅在truefalse原子上工作,并在提供其他任何内容时使用BadBooleanError失败。

据说这两个操作员都是短路的,这意味着一旦结果很明显,这些操作员将立即削减计算。

编程语言实现了真相和虚假的价值类型的概念,以便在 boolean逻辑中使用它们。某些值被认为是 false ,而另一些值则被认为是 true ,当用于布尔操作中时,函数的最后值或表达式的最后值是 - 返回,允许我们如前所述,缩短并分支我们的功能。

对于我所知道的每种语言都是如此。

在elixir(用erlang/otp 21编译的1.7.3(我认为我们的行为是一致的,即使数字为零:

(0 || false) == 0 # true
(0 || false) === 0 # true

只是在JavaScript(Google Chrome V74(中进行比较:

(0 || false) == 0 // true
(0 || false) === 0 // false

最新更新