在iex
控制台上,我发现以下错误,我不确定自己做错了什么......
case %{} do
x when x == %{} -> true
_x -> false
end
导致以下错误:
** (ErlangError) erlang error: :guard_expr
另外,我想解释一下我是如何找到这个的。我尝试通过查看elixir的实现并将其更改为将||
,[]
和{}
视为与{{1}相同来创建自己的%{}
宏}和false
。
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313
这是实施(它有同样的问题):
nil
带走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
使事情有效。
答案 0 :(得分:1)
这似乎是一个Erlang错误。以下是重现该问题的erlang代码:
case #{} of X when X == #{} -> X end.
感谢大家的确认!有关更多详细信息,请参阅注释。