2017-08-04 3 views
1

Elixirs Kernel.put_in ist ideal zum Hinzufügen oder Aktualisieren eines Wertes tief in einer verschachtelten Struktur. Es wird jedoch nicht unterstützt, den Wert zu löschen, und ich sehe nirgends eine delete_in.Hat Elixir ein 'Kernel.delete_in`-Äquivalent?

Gibt es delete_in, pop_in, oder ein gleichwertiges existiert? So etwas wie das Hinzufügen und Aktualisieren von Funktionen sehen aus wie nette Pipelines, aber Löschen oder Popup-Funktionen sehen weniger aufgeräumt aus.

Antwort

2

Ja, Kernel.pop_in/1 und Kernel.pop_in/2 existieren, die sowohl den gelöschten Wert zurückgeben und der Datenwert ohne den gerade gelöschten Schlüssel/Pfad.

iex(1)> data = %{1 => %{2 => %{3 => 4, 5 => 6}}} 
%{1 => %{2 => %{3 => 4, 5 => 6}}} 
iex(2)> pop_in(data, [1, 2, 5]) 
{6, %{1 => %{2 => %{3 => 4}}}} 
iex(3)> pop_in(data[1][2][5]) 
{6, %{1 => %{2 => %{3 => 4}}}} 

Um nur die Daten ohne knallte Wert erhalten Sie Pattern-Matching oder |> elem(1) verwenden können:

iex(4)> pop_in(data, [1, 2, 5]) |> elem(1) 
%{1 => %{2 => %{3 => 4}}} 
iex(5)> pop_in(data[1][2][5]) |> elem(1) 
%{1 => %{2 => %{3 => 4}}} 
+1

Hilarious, dass ich das gar nicht bemerkt. Vielen Dank! –

1

Ja! Kernel.get_and_update_in/3 nimmt eine Funktion als drittes Argument, dass pro die Dokumentation,

ein Zwei-Element-Tupel zurückgeben muss: die „get“ Wert (der abgerufene Wert, , die, bevor sie zurück operiert werden kann) und das neuer Wert soll unter Schlüssel gespeichert werden. Der Spaß kann auch zurückkehren: Pop, was bedeutet, dass der aktuelle Wert aus der Struktur entfernt und zurückgegeben werden soll.

So konnte delete_in als

def delete_in(data, keys) do 
    {_val, data} = get_and_update_in(data, keys, fn key -> :pop end) 
    data 
end 

geschrieben werden oder ein get_and_update_in/3 in einer Pipeline direkt nutzen könnten, wie

data 
|> get_and_update(keys, fn key -> :pop end) 
|> elem(1) 
Verwandte Themen