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

Wan*_*ker 8 elixir

在Elixir中,多个表达式可以用semicolon(;)分隔.

Elixir在下面的函数定义中抱怨

defmodule Module2 do
    def func([c], n), do: IO.inspect(c); c + n
end
Run Code Online (Sandbox Code Playgroud)

有错误

** (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
Run Code Online (Sandbox Code Playgroud)

但是,Elixir对以下语法感到满意.

defmodule Module1 do
    def func([c], n) do 
        IO.inspect(c); c + n
    end
end
Run Code Online (Sandbox Code Playgroud)

我不确定为什么一个在另一个上工作 - 据我所知,两种函数定义的样式都是等价的.


完整的代码供参考

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)
Run Code Online (Sandbox Code Playgroud)

Paw*_*rok 11

如果你真的必须这样做,你需要使用括号:

defmodule Module2 do
  def func([c], n), do: (IO.inspect(c); c + n)
end
Run Code Online (Sandbox Code Playgroud)

原始问题是;vs函数/宏调用的优先级,因为它的解析方式如下:

defmodule Module2 do
  (def func([c], n), do: IO.inspect(c)); c + n
end
Run Code Online (Sandbox Code Playgroud)

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