为什么Elixir捕获操作符需要将函数绑定到值

zer*_*ing 5 elixir

我有以下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已经是一个函数?

zab*_*oco 8

这是因为编译器解析匿名函数的方式.

Rectangle.area/1将作为解析的一个部门Rectangle.area1(因此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)