我有以下elixir代码段:
defmodule Rectangle do
def area(a, b) do
a * b
end
def area(a) do
a * a
end
end
然后我将文件加载到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}}
它像我预期的那样工作正常
iex(2)> Rectangle.area(9)
81
现在我想将arity 1的area函数分配给匿名函数,如:
iex(3)> fun = Rectangle.area/1
** (UndefinedFunctionError) undefined function Rectangle.area/0
Rectangle.area()
但是当我打字时:
iex(3)> fun = &Rectangle.area/1
&Rectangle.area/1
然后它有效。为什么elixir期待&amp;在函数名称前面,虽然Rectangle.area已经是一个函数?
答案 0 :(得分:8)
这是因为这就是编译器解析anonymous function的方式。
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