Elixir 为什么数字| |布尔值是一个数字?

Elixir 为什么数字| |布尔值是一个数字?,elixir,Elixir,我不熟悉长生不老药,但我找不到我的问题的答案。 以下是我在iex中输入的一些示例 expression result 9 || true 9 true || 9 true 9 && true true true && 9 9 因此,当有一个|时,它将计算到第一个参数,当一个参数不是布尔值时,&&将计算到最后一个参数。 如何实现|和&&?他们为什么返回这些结果?这是短路布尔逻辑环境中的一种通用语言工具。要抛出一些有用示例的伪代码,请执行

我不熟悉长生不老药,但我找不到我的问题的答案。 以下是我在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

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

这是短路布尔逻辑上下文中的公共语言工具。要抛出一些有用示例的伪代码,请执行以下操作:

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

如果您的
&&
|
只返回布尔值,您将无法在一次操作中同时进行分支和计算。

尽管Charles的答案是正确的,但这并不能说明全部情况。一般来说,Elixir有两组不同的运算符用于处理“布尔”值:

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

    case left do # equivalent to left && right
      x when x in [nil, false] -> x
      _ -> right
    end
    
  • 仅在
    原子上工作,并且在提供任何其他信息时,将以
    BadBooleanError
    失败

正如所说的,这两个操作符都是短路的,这意味着一旦结果明显,它们就会减少计算。

虽然查尔斯的答案是正确的,但它并不能说明全部情况。一般来说,Elixir有两组不同的运算符用于处理“布尔”值:

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

    case left do # equivalent to left && right
      x when x in [nil, false] -> x
      _ -> right
    end
    
  • 仅在
    原子上工作,并且在提供任何其他信息时,将以
    BadBooleanError
    失败

正如所说的,这两个运算符都是短路的,这意味着一旦结果明显,它们就会减少计算。

编程语言实现了truty和falsy值类型的概念,以便在布尔逻辑中使用它们。当在布尔运算中使用时,有些值被认为是假的,而另一些值被认为是真的,并且函数的最后一个值(或表达式)被返回,这一事实允许我们对函数进行短路和分支,如前一个答案中所述

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

在Elixir(使用Erlang/OTP 21编译的1.7.3)中,我认为我们有一个一致的行为,即使使用数字0:

(0 |假)=0#真
(0 |假)==0 |真
与之相比,在Javascript(Google Chrome v74)中:

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

编程语言实现了truty和falsy值类型的概念,以便在布尔逻辑中使用它们。当在布尔运算中使用时,有些值被认为是假的,而另一些值被认为是真的,并且函数的最后一个值(或表达式)被返回,这一事实允许我们对函数进行短路和分支,如前一个答案中所述

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

在Elixir(使用Erlang/OTP 21编译的1.7.3)中,我认为我们有一个一致的行为,即使使用数字0:

(0 |假)=0#真
(0 |假)==0 |真
与之相比,在Javascript(Google Chrome v74)中:

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

这在大多数实现短路布尔逻辑的语言中都是正确的,而不会强制将结果转换为狭义约束的布尔类型。如果分支的第一个边为true,您只需按原样返回它,否则返回另一个边;这样,您不仅可以保留所需的真实性逻辑,还可以保留精确的值。JavaScript是否等同于该问题?Python是否等同于该问题。关键点是,当
X
为truthy时,
X | | Y=X
而不是
true
。这在大多数实现短路布尔逻辑而不强制结果为狭义约束布尔类型的语言中都是正确的。如果分支的第一个边为true,您只需按原样返回它,否则返回另一个边;这样,您不仅可以保留所需的真实性逻辑,还可以保留精确的值。JavaScript是否与问题等价?Python是否与问题等价?关键是当
X
为真时,
X | | Y=X
而不是
true
。代码示例很棒,但注释令人困惑,我不知道它的意思--(哦!现在我知道了)。将注释放在代码上方,并将其缩短为仅
left&&right
。代码示例很棒,但注释令人困惑,我不知道它的意思--(哦!现在我知道了)。将注释放在代码上方,并将其缩短为仅
左和右