Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药参数错误_Elixir - Fatal编程技术网

Elixir 长生不老药参数错误

Elixir 长生不老药参数错误,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还提供了三个布

有人能帮我们解释一下为什么我们的论点是错误的吗?难道我们不应该这样检查真实性吗?关于长生不老药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还提供了三个布尔运算符: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

因为
允许尾部递归,所以此函数将在常量堆栈空间中运行。如果
将检查其第二个参数的类型,则函数必须正常调用一个堆栈帧“更深”,并在返回时执行检查并返回值。

感谢您不仅解释了原因,还解释了其背后的原理