导入
简单函数
学习如何从零开始编写 Elixir 函数。
Elixir 是一种函数式语言,因此函数作为基本类型也就不足为奇了。
匿名函数使用 fn 关键字创建:fn 参数列表 -> 函数体 end。
可以将 fn...end 看作类似于字符串字面量周围的引号,只不过这里返回的是一个函数值,而不是字符串。我们可以将这个函数值传递给其他函数,也可以调用它并传入参数。
...
Simple function calling
最简单的函数由参数列表和函数体组成,两者之间用 -> 分隔。下面的例子定义了一个函数,将其绑定到变量 sum,然后调用它:
1iex> sum = fn (a, b) -> a + b end 2#Function<12.17052888 in :erl_eval.expr/5> 3iex> sum.(1, 2) 43
-
第一行中,我们创建了一个带有两个参数
a和b的函数fn,以end结束,并将该函数存储在变量sum中。 -
第二行代码中,我们使用
sum.(1,2)的语法来调用函数。其中的.表示函数调用,参数写在括号内。
注意: 如果函数不接受任何参数,调用时仍需使用括号
()。
模式匹配
当我们调用 sum.(2,3) 时,可能会认为只是简单地将 2 赋给参数 a,将 3 赋给 b。但“赋值”这个词应该引起警觉。Elixir 并没有赋值的概念,而是尝试将值与模式进行匹配。
如果我们写 a=2,Elixir 会通过将 a 绑定到值 2 来完成模式匹配。这正是 sum 函数被调用时发生的情况。当我们传入 2 和 3 作为参数,Elixir 尝试将这些参数与 a 和 b 匹配时,等同于写 {a,b} = {2,3}。
这意味着我们在调用函数时可以进行更复杂的模式匹配。
例如,下面的函数可以反转二元元组中元素的顺序:
1iex> swap = fn { a, b } -> { b, a } end 2#Function<12.17052888 in :erl_eval.expr/5> 3iex> swap.( { 6, 8 } ) 4{8, 6}
在接下来的课程中,我们将利用这种模式匹配的能力来处理具有多个实现的函数。
动手实践
请在下方终端中尝试上述命令。别忘了先启动 iex 会话。
Terminal