get_in用于嵌套列表&灵丹妙药中的结构

时间:2016-10-04 14:51:18

标签: elixir

我有一个结构

s = [
  a: %Bla{
   b: "c"
  }
]

我想从中获取c值。我正在努力

get_in(s, [:a, :b])

但它不是为了从结构中获取价值而设计的。是否有任何类比允许我使用嵌套结构从列表中获取c

2 个答案:

答案 0 :(得分:7)

作为documentedget_in默认情况下不适用于结构:

  

Access语法(foo [bar])不能用于访问结构中的字段,因为默认情况下结构不会实现Access行为。这也是设计决策:动态访问查找旨在用于动态键值结构,如地图和关键字,而不是像结构一样的静态结构。

有两种方法可以达到你想要的效果:

  1. 为您的结构实施Access协议。

  2. 使用Access.key(:foo)代替:foo

  3. 我会用(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