【问题标题】:Why is number || boolean a number?为什么是数字||布尔数字?
【发布时间】:2019-09-30 17:11:30
【问题描述】:

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

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

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

【问题讨论】:

  • 这在 大多数 语言中都是正确的,这些语言实现了短路布尔逻辑,而不将结果强制为狭窄约束的布尔类型。如果分支的第一侧为真,则完全原样返回,否则返回另一侧;这样,您不仅可以保留所需的真实性逻辑,还可以保留确切的值。
  • stackoverflow.com/questions/5417969/… 是一个 JavaScript 等价于问题
  • stackoverflow.com/questions/9797522/… 是一个 Python 等价于问题。
  • 关键是当X为真时,X || Y = X而不是true

标签: elixir


【解决方案1】:

这是短路布尔逻辑上下文中的通用语言工具。扔掉一些有用的例子的伪代码:

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】:

    虽然查尔斯的回答是正确的,但它并不能说明整个故事。一般来说,Elixir 有两组不同的运算符来处理“布尔”值:

    • &&|| - 这些适用于所有类型,literally 是以下的快捷方式:

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

    据说这两个运算符都是短路的,这意味着一旦结果明显,它们就会切断计算。

    【讨论】:

    • 代码示例很棒,但注释令人困惑,我不知道这是什么意思——(哦!现在我知道了)。将注释放在代码上方并将其缩短为 left && right 怎么样?
    【解决方案3】:

    编程语言实现了真值类型和假值类型的概念,以便在布尔逻辑中使用它们。一些值被认为是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
    

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 2015-02-19
      • 2023-03-04
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2011-01-29
      • 2013-02-24
      • 2013-06-29
      相关资源
      最近更新 更多