Elixir 關(guān)鍵詞列表

2023-12-15 16:26 更新

在許多函數(shù)式編程語言中,經(jīng)常用到一個(gè)由2值元組組成的列表,來表示一個(gè)聯(lián)想數(shù)據(jù)結(jié)構(gòu)。在Elixir中,當(dāng)我們擁有一個(gè)由元組組成的列表,且元組第一個(gè)元素(鍵)是一個(gè)原子,那么我們稱其為關(guān)鍵詞列表:

iex> list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> list == [a: 1, b: 2]
true
iex> list[:a]
1

如你所見,Elixir支持用一種特殊語法來定義此類列表,它們實(shí)際上是元組列表的映射。由于它們也是列表,所以支持任何對列表的操作。例如,我們可以使用++來向關(guān)鍵詞列表中添加新值:

iex> list ++ [c: 3]
[a: 1, b: 2, c: 3]
iex> [a: 0] ++ list
[a: 0, a: 1, b: 2]

注意往列表前添加的值會(huì)先被檢索到:

iex> new_list = [a: 0] ++ list
[a: 0, a: 1, b: 2]
iex> new_list[:a]
0

關(guān)鍵詞列表有三個(gè)重要特點(diǎn):

  • 鍵必須是原子
  • 鍵的順序是由開發(fā)者指定的
  • 鍵可以被多次使用

例如,Ecto庫利用這些特性提供了一個(gè)優(yōu)雅的DSL用于書寫數(shù)據(jù)庫提問:

query = from w in Weather,
      where: w.prcp > 0,
      where: w.temp < 20,
     select: w

這些特性使得關(guān)鍵詞列表成為了Elixir中向函數(shù)傳遞設(shè)置的默認(rèn)機(jī)制。在第五章,但我們討論宏if/2時(shí),我們提到了下列語法:

iex> if false, do: :this, else: :that
:that

do:end:組合都是關(guān)鍵詞列表!事實(shí)上,上述調(diào)用等同于:

iex> if(false, [do: :this, else: :that])
:that

通常,當(dāng)關(guān)鍵詞列表是函數(shù)的最后一個(gè)參數(shù)時(shí),方括號可以省略。

Elixir提供了Keyword模塊用于處理關(guān)鍵詞列表。記住,關(guān)鍵詞列表也是列表,具有和列表相同的線性性能特點(diǎn)。列表越長,尋找鍵和計(jì)算元素?cái)?shù)量等等的時(shí)間就越長。因此,在Elixir中關(guān)鍵詞列表只是備用選項(xiàng)。如果你想要存儲(chǔ)很多元素,或保證一個(gè)鍵最多只與一個(gè)值相聯(lián)系,那么你應(yīng)該使用映射。

盡管我們可以對關(guān)鍵詞列表進(jìn)行模式匹配,但在實(shí)際中很少用到,因?yàn)樗罅斜碇械脑貍€(gè)數(shù)和順序都要匹配:

iex> [a: a] = [a: 1]
[a: 1]
iex> a
1
iex> [a: a] = [a: 1, b: 2]
** (MatchError) no match of right hand side value: [a: 1, b: 2]
iex> [b: b, a: a] = [a: 1, b: 2]
** (MatchError) no match of right hand side value: [a: 1, b: 2]
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號