W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
我們經(jīng)常會用到映射中的映射,或者映射中的關(guān)鍵詞列表等等。Elixir在保持語言的不變特性的同時,提供了一系列你在命令語言中能找到的如put_in/2
,update_in/2
之類的宏來方便處理嵌套數(shù)據(jù)結(jié)構(gòu)。
想象一下你擁有如下的結(jié)構(gòu):
iex> users = [
john: %{name: "John", age: 27, languages: ["Erlang", "Ruby", "Elixir"]},
mary: %{name: "Mary", age: 29, languages: ["Elixir", "F#", "Clojure"]}
]
[john: %{age: 27, languages: ["Erlang", "Ruby", "Elixir"], name: "John"},
mary: %{age: 29, languages: ["Elixir", "F#", "Clojure"], name: "Mary"}]
我們擁有一個關(guān)于用戶的關(guān)鍵詞列表,每個值是一個映射,該映射包含了名字,年齡以及一個關(guān)于每人喜愛的編程語言的列表。如果我們想訪問john的年齡,我們需要寫:
iex> users[:john].age
27
我們也可以用這種格式來更新值:
iex> users = put_in users[:john].age, 31
[john: %{age: 31, languages: ["Erlang", "Ruby", "Elixir"], name: "John"},
mary: %{age: 29, languages: ["Elixir", "F#", "Clojure"], name: "Mary"}]
宏update_in/2
也是類似,但允許我們傳遞一個函數(shù)來控制值的變化。例如,讓我們從Mary的語言列表中刪除“Clojure”:
iex> users = update_in users[:mary].languages, &List.delete(&1, "Clojure")
[john: %{age: 31, languages: ["Erlang", "Ruby", "Elixir"], name: "John"},
mary: %{age: 29, languages: ["Elixir", "F#"], name: "Mary"}]
關(guān)于put_in/2
和update_in/2
還有很多要學(xué)習(xí)的,包括能讓我們獲取一個值的同時更新數(shù)據(jù)結(jié)構(gòu)的get_and_update_in/2
。還有能動態(tài)訪問數(shù)據(jù)結(jié)構(gòu)的put_in/3
,update_in/3
以及get_and_update_in/3
。進入Kernel
模塊中它們各自的文檔獲取更多信息。
總結(jié)一下Elixir中的聯(lián)想數(shù)據(jù)結(jié)構(gòu)。你會發(fā)理解了關(guān)鍵詞列表和映射,你總能使用正確的工具來處理Elixir中需要用到聯(lián)想數(shù)據(jù)結(jié)構(gòu)的問題。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: