为什么数字||布尔值?

时间:2019-05-13 17:47:41

标签: elixir

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

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

因此,当有一个||时,它将计算为第一个参数,而当一个参数不是布尔值时,则将&&保留为最后一个。 ||&&如何实现?他们为什么返回这些结果?

3 个答案:

答案 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
    
  • andor仅适用于truefalse原子,并且在提供其他任何内容时将失败,并以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
相关问题