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

Elixir - Multiple expressions on same line - Compiler error when using do: syntax in function definition

在 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

原来的问题是 ; 与 function/macro 调用的优先级,因此它被这样解析:

defmodule Module2 do
  (def func([c], n), do: IO.inspect(c)); c + n
end

您可以验证这给出了与您提到的完全相同的错误 - 编译器自然会抱怨,因为您试图在函数上下文之外使用 c