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