我是长生不老药的新手,但我找不到问题的答案。这是我输入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
-
and
和or
仅在true
和false
原子上工作,并在提供其他任何内容时使用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