W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
在許多函數(shù)式編程語言中,經(jīng)常用到一個由2值元組組成的列表,來表示一個聯(lián)想數(shù)據(jù)結(jié)構(gòu)。在Elixir中,當(dāng)我們擁有一個由元組組成的列表,且元組第一個元素(鍵)是一個原子,那么我們稱其為關(guān)鍵詞列表:
iex> list = [{:a, 1}, {:b, 2}]
[a: 1, b: 2]
iex> list == [a: 1, b: 2]
true
iex> list[:a]
1
如你所見,Elixir支持用一種特殊語法來定義此類列表,它們實際上是元組列表的映射。由于它們也是列表,所以支持任何對列表的操作。例如,我們可以使用++來向關(guān)鍵詞列表中添加新值:
iex> list ++ [c: 3]
[a: 1, b: 2, c: 3]
iex> [a: 0] ++ list
[a: 0, a: 1, b: 2]
注意往列表前添加的值會先被檢索到:
iex> new_list = [a: 0] ++ list
[a: 0, a: 1, b: 2]
iex> new_list[:a]
0
關(guān)鍵詞列表有三個重要特點:
例如,Ecto庫利用這些特性提供了一個優(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
時,我們提到了下列語法:
iex> if false, do: :this, else: :that
:that
do:
和end:
組合都是關(guān)鍵詞列表!事實上,上述調(diào)用等同于:
iex> if(false, [do: :this, else: :that])
:that
通常,當(dāng)關(guān)鍵詞列表是函數(shù)的最后一個參數(shù)時,方括號可以省略。
Elixir提供了Keyword
模塊用于處理關(guān)鍵詞列表。記住,關(guān)鍵詞列表也是列表,具有和列表相同的線性性能特點。列表越長,尋找鍵和計算元素數(shù)量等等的時間就越長。因此,在Elixir中關(guān)鍵詞列表只是備用選項。如果你想要存儲很多元素,或保證一個鍵最多只與一個值相聯(lián)系,那么你應(yīng)該使用映射。
盡管我們可以對關(guān)鍵詞列表進(jìn)行模式匹配,但在實際中很少用到,因為它要求列表中的元素個數(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]
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: