Elixir 长生不老药参数错误
有人能帮我们解释一下为什么我们的论点是错误的吗?难道我们不应该这样检查真实性吗?关于长生不老药1.3Elixir 长生不老药参数错误,elixir,Elixir,有人能帮我们解释一下为什么我们的论点是错误的吗?难道我们不应该这样检查真实性吗?关于长生不老药1.3 iex(1)> true and true true iex(2)> "true" "true" iex(3)> true true iex(4)> true and "true" "true" iex(5)> "true" and true ** (ArgumentError) argument error: "true" 从文档中: Elixir还提供了三个布
iex(1)> true and true
true
iex(2)> "true"
"true"
iex(3)> true
true
iex(4)> true and "true"
"true"
iex(5)> "true" and true
** (ArgumentError) argument error: "true"
从文档中:
Elixir还提供了三个布尔运算符:or、and和not。这些
运算符是严格的,因为它们期望布尔值(真或假)
错误)作为他们的第一个论点:
iex> true and true
true
iex> false or is_atom(:example)
true
提供非布尔值将引发异常:
iex> 1 and true
** (ArgumentError) argument error: 1
所以这就是为什么它会上升的原因
为了做您想做的事情,您需要使用&&
操作符,因此
"true" && true
再次引用文档中的一句话:
除了这些布尔运算符外,Elixir还提供| |、&&和!
它接受任何类型的参数。对于这些运算符,所有值
除false和nil外,否则将计算为true:
# and
iex> nil && 13
nil
iex> true && 17
17
“wordy”布尔运算符-和
,或
和非
是严格的-它们期望所有值都是严格的布尔值。符号运算符-&&
,|
和代码>-操作“真实性”而不是严格的布尔值
因为所有布尔运算符都是短路运算符,它们实际上只会检查第一个参数是否为严格布尔运算符,但我不建议将它们用于非布尔运算符。Elixir有两组布尔运算符:
或
、和
以及非
原则上要求其参数为实际布尔值,即原子真
和假
|
、和&
和代码>接受任何类型的参数,并检查“真实性”
尽管事实上,或
和和
只检查第一个参数的类型。对于x
的任何值,表达式false或x
和true和x
将只返回x
。这似乎令人困惑,但它允许使用或
和和
作为递归函数中的最后一个表达式,而不会妨碍尾部递归。例如,考虑这个函数,它检查列表中的所有元素是否等于42:
def x([]) do
true
end
def x([h|t]) do
h == 42 and x(t)
end
因为和
允许尾部递归,所以此函数将在常量堆栈空间中运行。如果和
将检查其第二个参数的类型,则函数必须正常调用一个堆栈帧“更深”,并在返回时执行检查并返回值。感谢您不仅解释了原因,还解释了其背后的原理