Elixir 嵌套數(shù)據(jù)結(jié)構(gòu)

2023-12-14 17:03 更新

我們經(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/2update_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)的問題。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號