Elixir 模式匹配

2023-12-14 16:35 更新

匹配操作符不止能用來匹配簡單的值,還可以用于解構復雜的數(shù)據(jù)類型。例如,我們可以對元組進行模式匹配:

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

當兩邊不匹配時會出現(xiàn)錯誤。例如,元組的大小不同:

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]

與函數(shù)和類似,我們不能夠匹配空列表的頭尾:?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]

模式匹配使得開發(fā)者能夠簡單地解構例如元組和列表的數(shù)據(jù)類型。在之后的章節(jié)中我們將看到這是Elixir中遞歸的基礎,且其適用于其它類型,例如映射與二進制。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號