Elixir 匿名函数

我们已经在前面的 Elixir 数据类型 里简单的介绍了下 Elixir 的函数。其实那个章节感觉有点小了,连函数怎么定义我们都没说。 算了算了,反正后面会有一大篇幅来介绍的。

同学们,你只要跟者我的教程走就好了。

Elixir 除了提供普通的函数功能,还支持 匿名函数。这个 匿名函数 啊,在其它的语言里有可能叫做 闭包

但是,因为 Elixir 定义函数的时候的 fnend 确实不可或缺的。但是,但是,因为 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 既然号称 函数式编程语言,那么什么是函数式编程语言呢?

就是说呀,函数是一等公民,跟 intbool 等基础数据类型一样,可以:

  1. 函数可以作为参数传递给另一个函数
  2. 函数的返回值可以是另一个函数
  3. 函数名可以赋值给一个变量来创造别名。

至于演示嘛?上面的 is_function/1is_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

请记住,函数内部分配的变量不会影响其周围的环境,这个叫做 作用域屏蔽

等等啊,好像不叫这个名字,我一时想不起来了。

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.