Elixir 嵌套数据结构
2023-12-14 17:03 更新
我们经常会用到映射中的映射,或者映射中的关键词列表等等。Elixir在保持语言的不变特性的同时,提供了一系列你在命令语言中能找到的如put_in/2
,update_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/2
和update_in/2
还有很多要学习的,包括能让我们获取一个值的同时更新数据结构的get_and_update_in/2
。还有能动态访问数据结构的put_in/3
,update_in/3
以及get_and_update_in/3
。进入Kernel
模块中它们各自的文档获取更多信息。
总结一下Elixir中的联想数据结构。你会发理解了关键词列表和映射,你总能使用正确的工具来处理Elixir中需要用到联想数据结构的问题。
以上内容是否对您有帮助:
更多建议: