Elixir-参数错误

sat*_*sat 4 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"
Run Code Online (Sandbox Code Playgroud)

leg*_*cia 5

Elixir有两组布尔运算符:

  • orand并且not原则上要求他们的论点是实际的布尔值,即原子truefalse
  • ||&&!接受任何类型的参数,然后检查“真实性”。

尽管事实上,or并且and只检查的类型,第一个参数。对于任何值x,表达式false or xand true and x将简单地返回x。这似乎令人困惑,但是它允许在递归函数中使用orand and作为最后一个表达式,而不会阻止尾递归。例如,考虑以下函数,该函数检查列表中的所有元素是否等于42:

def x([]) do
  true
end
def x([h|t]) do
  h == 42 and x(t)
end
Run Code Online (Sandbox Code Playgroud)

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