2016-05-04 8 views

Antwort

9

Verwendung Kernel.get_in/2:

iex(1)> m = %{foo: %{bar: %{baz: 1}}} 
%{foo: %{bar: %{baz: 1}}} 
iex(2)> get_in m, [:foo, :bar, :baz] 
1 
iex(3)> get_in m, [:foo, :zot] 
nil 
1

get_in arbeitet mit Karten in Ordnung. Um etwas zu erstellen, das sowohl mit Karten als auch mit Strukturen funktioniert, müssen Sie es selbst erstellen:

def dig(nil, _), do: nil 
def dig(struct, []), do: struct 
def dig(struct, [head | tail]) do 
    struct 
    |> Map.get(head) 
    |> dig(tail) 
end 


> m = %{foo: %{bar: %{baz: 1}}} 
> dig m, [:foo, :bar, :baz] 
1 
> dig m, [:foo, :zot] 
nil 
> dig m, [:foo, :zot, :qux] 
nil