Logo
Section 1 / 5

简单函数

学习如何从零开始编写 Elixir 函数。

导入

简单函数

学习如何从零开始编写 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

Elixir 基础

返回一个函数