Elixir - 同一行上的多个表达式 - 在函数定义中使用do:syntax时编译器错误

时间:2015-08-01 16:53:03

标签: elixir

在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)

1 个答案:

答案 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