在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)
答案 0 :(得分:11)
如果你真的必须这样做,你需要使用括号:
defmodule Module2 do
def func([c], n), do: (IO.inspect(c); c + n)
end
原始问题是;
与函数/宏调用的优先级,因为它被解析为:
defmodule Module2 do
(def func([c], n), do: IO.inspect(c)); c + n
end
您可以验证这会给出您提到的完全相同的错误 - 编译器自然会抱怨,因为您尝试在函数的上下文之外使用c
。