Elixier - Karten

Schlüsselwortlisten sind eine bequeme Möglichkeit, Inhalte, die in Listen gespeichert sind, nach Schlüsseln zu adressieren. Darunter geht Elixir jedoch immer noch durch die Liste. Dies ist möglicherweise geeignet, wenn Sie andere Pläne für diese Liste haben, bei denen Sie alles durchgehen müssen. Es kann jedoch ein unnötiger Aufwand sein, wenn Sie planen, Schlüssel als einzigen Ansatz für die Daten zu verwenden.

Hier kommen Karten zu Ihrer Rettung. Wenn Sie einen Schlüsselwertspeicher benötigen, sind Maps die Datenstruktur von "Gehe zu" in Elixir.

Karte erstellen

Eine Map wird mit der% {} -Syntax erstellt -

map = %{:a => 1, 2 => :b}

Im Vergleich zu den Keyword-Listen sehen wir bereits zwei Unterschiede:

  • Karten erlauben jeden Wert als Schlüssel.
  • Die Schlüssel der Karten folgen keiner Reihenfolge.

Zugriff auf einen Schlüssel

Um auf den mit einem Schlüssel verknüpften Wert zuzugreifen, verwenden Maps dieselbe Syntax wie Keyword-Listen.

map = %{:a => 1, 2 => :b}
IO.puts(map[:a])
IO.puts(map[2])

Wenn das obige Programm ausgeführt wird, generiert es das folgende Ergebnis:

1
b

Schlüssel einstecken

Um einen Schlüssel in eine Karte einzufügen, verwenden wir die Dict.put_new Funktion, die die Karte, den neuen Schlüssel und den neuen Wert als Argumente verwendet -

map = %{:a => 1, 2 => :b}
new_map = Dict.put_new(map, :new_val, "value") 
IO.puts(new_map[:new_val])

Dadurch wird das Schlüssel-Wert-Paar eingefügt :new_val - "value"in einer neuen Karte. Wenn das obige Programm ausgeführt wird, generiert es das folgende Ergebnis:

"value"

Einen Wert aktualisieren

Um einen bereits in der Karte vorhandenen Wert zu aktualisieren, können Sie die folgende Syntax verwenden:

map = %{:a => 1, 2 => :b}
new_map = %{ map | a: 25}
IO.puts(new_map[:a])

Wenn das obige Programm ausgeführt wird, generiert es das folgende Ergebnis:

25

Mustervergleich

Im Gegensatz zu Keyword-Listen sind Karten beim Pattern Matching sehr nützlich. Wenn eine Karte in einem Muster verwendet wird, stimmt sie immer mit einer Teilmenge des angegebenen Werts überein.

%{:a => a} = %{:a => 1, 2 => :b}
IO.puts(a)

Das obige Programm generiert das folgende Ergebnis:

1

Dies wird übereinstimmen a mit 1. Und daher wird die Ausgabe als generiert1.

Wie oben gezeigt, stimmt eine Karte überein, solange die Schlüssel im Muster in der angegebenen Karte vorhanden sind. Daher stimmt eine leere Karte mit allen Karten überein.

Variablen können beim Zugreifen auf, Abgleichen und Hinzufügen von Kartenschlüsseln verwendet werden -

n = 1
map = %{n => :one}
%{^n => :one} = %{1 => :one, 2 => :two, 3 => :three}

Das Kartenmodul bietet eine sehr ähnliche API wie das Schlüsselwortmodul mit praktischen Funktionen zum Bearbeiten von Karten. Sie können Funktionen wie die verwendenMap.get, Map.delete, um Karten zu manipulieren.

Karten mit Atomtasten

Karten haben einige interessante Eigenschaften. Wenn alle Schlüssel in einer Karte Atome sind, können Sie der Einfachheit halber die Schlüsselwortsyntax verwenden -

map = %{:a => 1, 2 => :b} 
IO.puts(map.a)

Eine weitere interessante Eigenschaft von Maps ist, dass sie eine eigene Syntax für die Aktualisierung und den Zugriff auf Atomschlüssel bereitstellen.

map = %{:a => 1, 2 => :b}
IO.puts(map.a)

Das obige Programm generiert das folgende Ergebnis:

1

Beachten Sie, dass der Zugriff auf Atomschlüssel auf diese Weise vorhanden sein sollte, da das Programm sonst nicht funktioniert.