在Elixir中,我们可以使用以下方法从嵌套数据结构中获取数据:
data = %{field: %{other_field: 1}}
data[:field][:other_field]
Run Code Online (Sandbox Code Playgroud)
如果它包含列表,也可以使用
data = %{field: %{other_field: [1]}}
get_in data, [:field, :other_field, Access.at(0)]
Run Code Online (Sandbox Code Playgroud)
但是考虑到data.field.other_field是一个结构,如何获取该数据?上面的两种方法都会失败,因为结构没有实现Access.fetch/2。
data = %{field: %{other_field: %Struct{a: 1}}}
Run Code Online (Sandbox Code Playgroud)
那么访问除模式匹配之外的嵌套结构数据的正确方法是什么?
用途Access.key/2:
键(键,默认\\ nil)
访问映射/结构中的给定键。
如果键不存在或访问的值为,则使用默认值
nil。
iex(1)> defmodule Struct do
...(1)> defstruct [:a]
...(1)> end
iex(2)> data = %{field: %{other_field: %Struct{a: 1}}}
%{field: %{other_field: %Struct{a: 1}}}
iex(3)> get_in data, [:field, :other_field, Access.key(:a)]
1
iex(4)> get_in data, [:field, :other_field, Access.key(:b, :default)]
:default
Run Code Online (Sandbox Code Playgroud)