Elixir-同一行上有多个表达式-使用do : syntax in function definition时发生编译器错误

标签 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)

最佳答案

如果确实必须执行此操作,则需要使用括号:

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/

相关文章:

elixir - 如何别名在mix.exs中运行两次?

elixir - 用 Phoenix 格式化时间

erlang - 如何检查 ETS Erlang/Elixir 中是否存在命名表

elixir - 如何在 iex 主作用域中定义函数?

elixir - 如何将erlang源文件添加到elixir包中以十六进制发布

testing - exunit 测试用例的可覆盖宏

elixir - Phoenix 实时重新加载因编译错误而中断

Elixir - 如何将字符串每 3 个字符拆分为一个列表

javascript - 如何在 Elixir 中编写多事件驱动的 if 子句?

elixir - 如何指示 ecto 不创建自动递增 id 字段?