Elixir 嵌套数据结构

2023-12-14 17:03 更新

我们经常会用到映射中的映射,或者映射中的关键词列表等等。Elixir在保持语言的不变特性的同时,提供了一系列你在命令语言中能找到的如put_in/2update_in/2之类的宏来方便处理嵌套数据结构。

想象一下你拥有如下的结构:

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"}]

我们拥有一个关于用户的关键词列表,每个值是一个映射,该映射包含了名字,年龄以及一个关于每人喜爱的编程语言的列表。如果我们想访问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也是类似,但允许我们传递一个函数来控制值的变化。例如,让我们从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"}]

关于put_in/2update_in/2还有很多要学习的,包括能让我们获取一个值的同时更新数据结构的get_and_update_in/2。还有能动态访问数据结构的put_in/3update_in/3以及get_and_update_in/3。进入Kernel模块中它们各自的文档获取更多信息。

总结一下Elixir中的联想数据结构。你会发理解了关键词列表和映射,你总能使用正确的工具来处理Elixir中需要用到联想数据结构的问题。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号