匿名函数

快速定义

进入Elixir Shell输入:

1
iex(1)> sum = fn a, b -> a + b end
#Function<12.90072148/2 in :erl_eval.expr/5>

匿名函数的定义以关键字fn开始, 然后紧跟参数列表, 再接符号->, 其后为函数体, 并以关键字end结束匿名函数的定义

要调用匿名函数,需要使用dot(点)语法.

1
iex(2)> sum.(1,2)
3

匿名函数作为参数

1
defmodule MyList do
    def filter([], _func) do
        []
    end
    def filter([head|tail], func) do
        if func.(head) do
            [head | filter(tail, func)]
        else
            filter(tail, func)
        end
    end
end
## 奇数
MyList.filter([1,2,3,4,5,6], fn num -> rem(num,2) == 1 end)

控制台输出:

1
iex(5)> MyList.filter([1,2,3,4,5,6], fn num -> rem(num,2) == 1 end)
[1, 3, 5]

匿名函数简写

我们可以把匿名函数fn n -> rem(n, 2) == 1 end简写为&(rem(&1, 2) == 1)

1
sum = fn a, b -> a + b end
# 等同于
sum = &(&1 + &2)

其中第一个&表示匿名函数本身&1表示匿名函数的第一个参数, &2表示匿名函数的第二个参数, 以此类推. 小括号内为函数体表达式.