以下代码被mix
视为错误:
case test do
...
t when !is_list(t) -> false
...
end
错误是“警卫中的表达式无效,警卫不允许使用案例”。
但是,如果我删除!
,即写
case test do
...
t when is_list(t) -> false
...
end
没有报告错误。
这不可能是对的吗? !
应该只是否定函数。
答案 0 :(得分:4)
我认为如果您使用关键字not
而不是!
,则可行。
Not
,在守卫测试中不允许!
。
答案 1 :(得分:1)
!
不是否定函数,它是一个宏。
请参阅elixir中的代码,lib/elixir/lib/kernel.ex: 1552
,
defmacro !value
defmacro !{:!, _, [value]} do
optimize_boolean(
quote do
case unquote(value) do
x when :"Elixir.Kernel".in(x, [false, nil]) -> false
_ -> true
end
end
)
end
defmacro !value do
optimize_boolean(
quote do
case unquote(value) do
x when :"Elixir.Kernel".in(x, [false, nil]) -> true
_ -> false
end
end
)
end
扩展的!
宏是case statement
,不允许使用长生不老药。
而不是erlang函数:
@spec not true :: false
@spec not false :: true
def not value do
:erlang.not(value)
end