在iex
控制台上,我发现了以下错误,但我不确定我做错了什么...
case %{} do
x when x == %{} -> true
_x -> false
end
以下是翻译的结果:
会导致以下错误:
** (ErlangError) erlang error: :guard_expr
此外,我想解释一下我是如何找到这个问题的。我试图通过查看Elixir的实现并将其更改为将
[]
,{}
和%{}
视为false
和nil
来创建自己的||
宏。https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313
以下是该实现(它具有相同的问题):defmodule Or do
defmacro left || right do
quote do
case unquote(left) do
x when x in [false, nil] or x == [] or x == {} or x == %{} ->
unquote(right)
x ->
x
end
end
end
end
取走
or x == %{}
即可使事情正常运作。
y = %{}; case y, do: (x when x == y -> true; _x -> false)
- Christian