我有以下elixir代码片段:
defmodule Rectangle do
def area(a, b) do
a * b
end
def area(a) do
a * a
end
end
Run Code Online (Sandbox Code Playgroud)
然后我将文件加载到iex会话中,如下所示:
iex(1)> import_file "rectangle.exs"
{:module, Rectangle,
<<70, 79, 82, 49, 0, 0, 5, 84, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 204, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
{:area, 1}}
Run Code Online (Sandbox Code Playgroud)
它像我预期的那样工作得很好
iex(2)> Rectangle.area(9)
81
Run Code Online (Sandbox Code Playgroud)
现在我想将arity 1的area函数分配给匿名函数,如:
iex(3)> fun = Rectangle.area/1
** (UndefinedFunctionError) undefined function Rectangle.area/0
Rectangle.area()
Run Code Online (Sandbox Code Playgroud)
但是当我打字时:
iex(3)> fun = &Rectangle.area/1
&Rectangle.area/1
Run Code Online (Sandbox Code Playgroud)
然后它工作.为什么elixir期望&在函数名称前面,虽然Rectangle.area已经是一个函数?
这是因为编译器解析匿名函数的方式.
Rectangle.area/1将作为解析的一个部门Rectangle.area到1(因此undefined function Rectangle.area/0错误).
您可以使用以下命令查看表达式的解析方式quote:
iex> quote do &Rectangle.area/1 end
iex> quote do Rectangle.area/1 end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |