在 Elixir 中,多个表达式可以用分号 (;
).
Elixir 在下面的函数定义中抱怨
defmodule Module2 do
def func([c], n), do: IO.inspect(c); c + n
end
有错误
** (CompileError) hello.exs:2: undefined function c/0
(stdlib) lists.erl:1352: :lists.mapfoldl/3
(stdlib) lists.erl:1352: :lists.mapfoldl/3
(stdlib) lists.erl:1353: :lists.mapfoldl/3
然而,Elixir 对以下语法很满意。
defmodule Module1 do
def func([c], n) do
IO.inspect(c); c + n
end
end
我不确定为什么其中一种比另一种更有效——据我了解,两种风格的函数定义是等效的。
完整代码如下供参考
defmodule Module1 do
def func([c], n) do
IO.inspect(c); c + n
end
end
defmodule Module2 do
def func([c], n), do: IO.inspect(c); c + n
end
Module1.func('r', 13)
Module2.func('r', 13)
如果您确实必须这样做,则需要使用括号:
defmodule Module2 do
def func([c], n), do: (IO.inspect(c); c + n)
end
原来的问题是优先级;
vs 函数/宏调用,因此它的解析如下:
defmodule Module2 do
(def func([c], n), do: IO.inspect(c)); c + n
end
您可以验证这是否给出了与您提到的完全相同的错误 - 编译器自然会抱怨,因为您正在尝试使用c
在函数的上下文之外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)