Elixir 模式匹配

2023-12-14 16:35 更新

匹配操作符不止能用来匹配简单的值,还可以用于解构复杂的数据类型。例如,我们可以对元组进行模式匹配:

iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"

当两边不匹配时会出现错误。例如,元组的大小不同:

iex> {a, b, c} = {:hello, "world"}
** (MatchError) no match of right hand side value: {:hello, "world"}

或者类型不匹配:

iex> {a, b, c} = [:hello, "world", 42]
** (MatchError) no match of right hand side value: [:hello, "world", 42]

有趣的是,我们可以匹配特殊的值。比如下面的例子,当右边是一个以开头的元组时才能匹配:​:ok

iex> {:ok, result} = {:ok, 13}
{:ok, 13}
iex> result
13

iex> {:ok, result} = {:error, :oops}
** (MatchError) no match of right hand side value: {:error, :oops}

我们可以对列表进行模式匹配:

iex> [a, b, c] = [1, 2, 3]
[1, 2, 3]
iex> a
1

列表支持匹配它的头尾:

iex> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex> head
1
iex> tail
[2, 3]

与函数和类似,我们不能够匹配空列表的头尾:​hd/1​tl/1

iex> [h | t] = []
** (MatchError) no match of right hand side value: []

[head | tail]​格式不仅用于模式匹配,还可用于往列表前添加元素:

iex> list = [1, 2, 3]
[1, 2, 3]
iex> [0 | list]
[0, 1, 2, 3]

模式匹配使得开发者能够简单地解构例如元组和列表的数据类型。在之后的章节中我们将看到这是Elixir中递归的基础,且其适用于其它类型,例如映射与二进制。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号