2016-08-09 41 views
2

Ich habe eine Struktur, die einen verschachtelten Schlüssel mit einer anderen Liste von Strukturen hat, und ich möchte diese verschachtelten Schlüsselwerte mit neuen Werten aktualisieren.Kann einen Wert eines Hash nicht aktualisieren

source = get_data 

# source.key1 is an array of structs 

source.key1 = Enum.each(source.key1, fn(x) -> # error is here at "=" 
    # ... 
end) 

Der Fehler ist:

cannot invoke remote function source.key1/0 inside match 

weder diese:

aa = Enum.each(source.key1, fn(x) -> 
    # ... 
end) 

source.key1 = aa # error is here 

Antwort

1

überprüfen Wenn Sie eine Karte haben, die wie folgt aussieht:

my_map.a für get "a":

my_map = %{a: "a", "b" => b} 

Sie es mit Zugriff my_map [a] für get "a" my_map [ "b"] für get "b"

Sie nicht atom s anwenden können Yntax für Schlüssel, die kein Atom ist.

die Karte bearbeiten Sie zwei Funktionen verwenden sollten:

Map.put(my_map, "new_key", "new_value") 
or 
Map.update(my_map, "new_key", "init value", fn for add values) # handy in recursion loop 

Es gibt auch Map.update!/3, aber es wird KeyError zu erhöhen, wenn Schlüssel nicht in der Karte ist.

1

Sie nicht eine Karte mit source.key1 = ...

Der Fehler aktualisieren können Sie sehen, werden als Ergebnis ist Versuchen, eine Funktion während der Mustererkennung aufzurufen.

Um eine Karte aktualisieren Sie entweder tun können:

%{source | key1: aa} 

Dies wird erhöhen, wenn key1 nicht bereits in der Karte vorhanden sind.

Oder:

Map.put(source, :key1, aa) 

Dies wird nicht erhöhen, wenn key1 nicht bereits in der Karte vorhanden ist.


Sie sollten auch beachten, dass das Ergebnis der Enum.each ist das Atom :ok so wird diese key1 auf :ok gesetzt.

Vielleicht möchten Sie eine Enum.map/2?

Sie sollten auch update_in/3