在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在函数的上下文之外使用.
| 归档时间: |
|
| 查看次数: |
1769 次 |
| 最近记录: |