有人可以帮忙解释一下为什么会出现参数错误吗?我们不应该这样检查真实性吗?在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
原则上要求它们的参数是实际的布尔值,即原子true
和false
||
,&&
并!
接受任何类型的参数,然后检查“真实性”。尽管事实上,or
并且and
只检查的类型,第一个参数。对于任何值x
,表达式false or x
andtrue and x
都将简单地返回x
。这似乎令人困惑,但是它允许在递归函数中使用or
和and
作为最后一个表达式,而不会阻止尾递归。例如,考虑以下函数,该函数检查列表中的所有元素是否等于42:
def x([]) do
true
end
def x([h|t]) do
h == 42 and x(t)
end
因为and
允许尾部递归,所以此函数将在恒定的堆栈空间中运行。如果and
要检查其第二个参数的类型,则该函数将必须正常调用一个堆栈帧“ deeper”,并在返回时执行检查并返回值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句