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

时间:2016-02-16 19:53:19

标签: elixir

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

1 个答案:

答案 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