In Elixier haben wir Karten:
> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a # = "one"
> map[:a] # = "one"
Wir haben auch Keyword-Listen:
> kl = [a: "one", b: "two"] # = [a: "one", b: "two"]
> kl2 = [{:a, "one"},{:b, "two"}] # = [a: "one", b: "two"]
> kl == kl2 # = true
> kl[:a] # = "one"
> kl.a # = ** (ArgumentError)
Warum beides?
Syntax? Liegt es daran, dass Keyword-Listen eine flexiblere Syntax haben, mit der sie ohne Curlys und sogar ohne Klammern als letzter Parameter eines Funktionsaufrufs definiert werden können? Warum geben Sie Maps dann nicht diesen syntaktischen Zucker?
Doppelte Schlüssel? Liegt es daran, dass Keyword-Listen doppelte Schlüssel haben können? Warum sollten Sie sowohl Zugriff im Kartenstil als auch doppelte Schlüssel wünschen?
Performance? Liegt es daran, dass Keyword-Listen eine bessere Leistung haben? Warum dann Karten? Und sollten Karten nicht leistungsfähiger sein, wenn es darum geht, Mitglieder nach Schlüssel zu suchen, als eine Liste von Tupeln?
JS Array und Ruby Hash mögen Aussehen? Ist es das?
Ich verstehe, dass es sich strukturell um unterschiedliche Datendarstellungen handelt. Mir scheint, dass Keyword-Listen in Elixier dazu dienen, die Sprache durch außergewöhnliche Syntax (3 verschiedene syntaktische Varianten), Überschneidungen von Anwendungsfällen mit Karten und einen unklaren Vorteil zu komplizieren.
Was ist der Vorteil der Verwendung von Keyword-Listen?
Der Hauptvorteil von Keyword-Listen ist die Abwärtskompatibilität mit vorhandenen Elixier- und Erlang-Codebasen.
Sie fügen auch Syntaxzucker hinzu, wenn sie als Funktionsargumente verwendet werden, die beispielsweise einer Ruby-Syntax ähneln:
Der Hauptnachteil der Verwendung von Schlüsselwortlisten besteht darin, dass kein teilweiser Mustervergleich für sie durchgeführt werden kann:
Erweitern wir es auf Funktionsargumente. Stellen Sie sich vor, wir müssen eine Multiclause-Funktion ausführen, die auf einem Wert einer der folgenden Optionen basiert:
Dies wird niemals Folgendes ausführen
do_special_thing
:Mit Map-Argumenten funktioniert es:
quelle
Karten erlauben nur einen Eintrag für einen bestimmten Schlüssel, während Schlüsselwortlisten die Wiederholung des Schlüssels ermöglichen. Karten sind effizient (insbesondere wenn sie wachsen) und können für den Mustervergleich von Elixir verwendet werden.
Verwenden Sie im Allgemeinen Schlüsselwortlisten für Dinge wie Befehlszeilenparameter und zum Weitergeben von Optionen und verwenden Sie Maps (oder eine andere Datenstruktur, das HashDict), wenn Sie ein assoziatives Array wünschen.
quelle