在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
原始文件的问题是
;
与函数/宏调用的优先级,因此,它的解析方式如下:defmodule Module2 do
(def func([c], n), do: IO.inspect(c)); c + n
end
您可以验证是否给出了与您提到的错误完全相同的错误-编译器自然会提示,因为您试图在函数上下文之外使用
c
。
关于Elixir-同一行上有多个表达式-使用do : syntax in function definition时发生编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763989/