W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在許多函數(shù)式編程語(yǔ)言中,經(jīng)常用到一個(gè)由2值元組組成的列表,來(lái)表示一個(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
如你所見(jiàn),Elixir支持用一種特殊語(yǔ)法來(lái)定義此類(lèi)列表,它們實(shí)際上是元組列表的映射。由于它們也是列表,所以支持任何對(duì)列表的操作。例如,我們可以使用++來(lái)向關(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):
例如,Ecto庫(kù)利用這些特性提供了一個(gè)優(yōu)雅的DSL用于書(shū)寫(xiě)數(shù)據(jù)庫(kù)提問(wèn):
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í),我們提到了下列語(yǔ)法:
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í),方括號(hào)可以省略。
Elixir提供了Keyword
模塊用于處理關(guān)鍵詞列表。記住,關(guān)鍵詞列表也是列表,具有和列表相同的線性性能特點(diǎn)。列表越長(zhǎng),尋找鍵和計(jì)算元素?cái)?shù)量等等的時(shí)間就越長(zhǎng)。因此,在Elixir中關(guān)鍵詞列表只是備用選項(xiàng)。如果你想要存儲(chǔ)很多元素,或保證一個(gè)鍵最多只與一個(gè)值相聯(lián)系,那么你應(yīng)該使用映射。
盡管我們可以對(duì)關(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]
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: