我是Elixir的新手,但找不到我的问题的答案。
这是我输入到iex
的一些示例。
expression result
9 || true 9
true || 9 true
9 && true true
true && 9 9
因此,当有一个||
时,它将计算为第一个参数,而当一个参数不是布尔值时,则将&&
保留为最后一个。
||
和&&
如何实现?他们为什么返回这些结果?
答案 0 :(得分:4)
这是布尔逻辑短路情况下的一种通用语言工具。在某些有用的示例情况下抛出伪代码:
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
如果您的&&
和||
仅返回布尔值,那么您将无法在单个操作中分支和计算。
答案 1 :(得分:3)
尽管查尔斯的回答是正确的,但并不能说明全部。通常,Elixir有2套不同的运算符集可用于处理“布尔值”值:
&&
和||
-它们适用于所有类型,而literally是以下各项的快捷方式:
case left do # equivalent to left && right
x when x in [nil, false] -> x
_ -> right
end
and
和or
仅适用于true
和false
原子,并且在提供其他任何内容时将失败,并以BadBooleanError
出现。而且据说这两个运算符都在短路,这意味着一旦结果显而易见,它们就会削减计算。
答案 2 :(得分:-1)
为了在布尔逻辑中使用真值和虚假值类型,编程语言实现了它们的概念。在布尔运算中使用时,某些值被认为是 false ,而另一些则被认为是 true ,并且函数的最后一个值是 or表达式-返回,使我们能够如上一个答案中所述短路并分支我们的功能。
我所知道的每种语言都是如此。
在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