Elixir 匿名函数
我们已经在前面的 Elixir 数据类型 里简单的介绍了下 Elixir 的函数。其实那个章节感觉有点小了,连函数怎么定义我们都没说。 算了算了,反正后面会有一大篇幅来介绍的。
同学们,你只要跟者我的教程走就好了。
Elixir 除了提供普通的函数功能,还支持 匿名函数。这个 匿名函数 啊,在其它的语言里有可能叫做 闭包。
但是,因为 Elixir 定义函数的时候的 fn
和 end
确实不可或缺的。但是,但是,因为 end
是 Elixir 的关键字,既可以单独放一行,也可以放在同一行。
所以,最简单的匿名函数可能就是下面这样了
add = fn a, b -> a + b end
在 iex
返回如下
iex(21)> add = fn a, b -> a + b end #Function<43.65746770/2 in :erl_eval.expr/5> iex(22)> add #Function<43.65746770/2 in :erl_eval.expr/5>
这个返回值我都认识,但是那个
43.65746770
数字是怎么算出来的啊???
匿名函数也是函数,把它赋值给一个变量后,我们就可以通过这个变量来调用函数了
iex(23)> add.(500,20) 520
对了,千万别忘记
add
和 括号之间那个点号.
,别问,以后会告诉你的。
匿名函数也是函数,Elixir 提供了 is_function/1
谓词来判断一个名字是否函数
iex(24)> is_function(add) true iex(25)> is_function(add2) ** (CompileError) iex:25: undefined function add2/0 (stdlib 3.16.1) lists.erl:1358: :lists.mapfoldl/3
is_function()/1
还有一个变体 is_function/2
,用来接收两个参数,第二个参数用于检查参数的个数
iex(25)> is_function(add,2) true iex(26)> is_function(add,1) false
函数式编程
我去,这个关键字会不会太晚了,其实应该在前面函数那里就说了。
Elixir 既然号称 函数式编程语言,那么什么是函数式编程语言呢?
就是说呀,函数是一等公民,跟 int
啊 bool
等基础数据类型一样,可以:
- 函数可以作为参数传递给另一个函数
- 函数的返回值可以是另一个函数
- 函数名可以赋值给一个变量来创造别名。
至于演示嘛?上面的 is_function/1
和 is_function/2
不是演示过了吗,哈哈。
匿名函数和命名函数
这两个概念很简单吧,命名函数 就是有名字的函数,其实就是在定义时,fn
关键字后面有函数名的那些函数,而 匿名函数 就是 fn
关键字后面只有括号的那些函数。
对了,调用匿名函数的时候, 变量名和括号之间必须有一个点。 其实啊,点号只有一个作用,就是区分调用的是 匿名函数 还是 命名函数。
从这个意义上说,Elixir 明确区分了匿名函数和命名函数。
越来越绕了,我们后面继续讲解吧。
闭包
其实,在其它语言里,匿名函数也叫 闭包。既然叫闭包啊,那么匿名函数内部就可以访问外部作用域范围内的变量。
我们来重新定义一个新的匿名函数,它使用我们之前定义的匿名函数 add/2
iex(27)> double = fn a -> add.(a, a) end #Function<44.65746770/1 in :erl_eval.expr/5>
调用呢,就简单了
iex(28)> double.(2) 4
请记住,函数内部分配的变量不会影响其周围的环境,这个叫做 作用域屏蔽。
等等啊,好像不叫这个名字,我一时想不起来了。