如何解决有什么问题:is_number如果为true,请执行1结束
为什么将第二种形式解析为2个参数传递给is_number?
is_number if true,do: 1
true
is_number if true do 1 end
** (CompileError) iex:42: undefined function is_number/2
解决方法
我们可以使用quoting mechanism来查看Elixir中表达式的解析方式。
iex(6)> IO.puts Macro.to_string(quote do: (is_number if true,do: 1))
is_number(if(true) do
1
end)
:ok
iex(7)> IO.puts Macro.to_string(quote do: (is_number if true do 1 end))
is_number(if(true)) do
1
end
:ok
因此,在您的第一种情况下,do
被解析为if
的参数,并且整个事情都传递给了is_number
。在第二个中,do
具有不同的优先级,并且最终绑定到is_number
本身作为第二个参数,因此我们最终调用了if/1
和is_number/2
,是胡说八道。
关于这是为什么,通常使用do
将完整表达式捕获为语句,例如
if something_really_complicated arg1,arg2,arg3 do
# ...
end
因此,在这种情况下,尽可能松散地绑定do
是有意义的。相反,如果我们尝试将do:
作为带有显式逗号的关键字参数传递,则它就像其他参数一样,因此它遵循通常的参数传递规则,而不是特殊的规则。
在诸如Elixir之类的语言中要记住的关键是,许多其他语言中的关键字实际上不在Elixir中。 if
语句的解析方式与宏完全相同,并且您可以轻松编写自己的if
宏,而do:
实际上只是一个带有一些语法糖的关键字参数,而不是特定于任何特定控制语句的任何内容。这是使Elixir(和公司)出色完成特定领域任务的重要原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。