Elixir:从嵌套结构中提取数据的最佳实践

Krz*_*nde 1 elixir

在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)

那么访问除模式匹配之外的嵌套结构数据的正确方法是什么?

Dog*_*ert 5

用途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)