我有一个结构
s = [
a: %Bla{
b: "c"
}
]
我想从中获取c
值。我正在努力
get_in(s, [:a, :b])
但它不是为了从结构中获取价值而设计的。是否有任何类比允许我使用嵌套结构从列表中获取c
?
答案 0 :(得分:7)
作为documented,get_in
默认情况下不适用于结构:
Access语法(foo [bar])不能用于访问结构中的字段,因为默认情况下结构不会实现Access行为。这也是设计决策:动态访问查找旨在用于动态键值结构,如地图和关键字,而不是像结构一样的静态结构。
有两种方法可以达到你想要的效果:
为您的结构实施Access
协议。
使用Access.key(:foo)
代替:foo
。
我会用(2):
iex(1)> defmodule Bla do
...(1)> defstruct [:b]
...(1)> end
iex(2)> s = [a: %Bla{b: "c"}]
[a: %Bla{b: "c"}]
iex(3)> get_in(s, [:a, Access.key(:b)])
"c"
答案 1 :(得分:0)
这是我的try
函数版本,用于从映射和结构中返回值:
def try(map, keys) do
Enum.reduce(keys, map, fn key, acc -> if acc, do: Map.get(acc, key) end)
end