2017-02-02 7 views
1

Ich verwende Karten in Elixier.Vergleichen Sie Karten in verschiedenen Formaten - Elixier

einige sind in %{"foo": "bar"} Format

und einige sind in %{"foo" => "bar"}

Ich habe zwei Karten:

a = %{"foo": "bar"} 
b = %{"foo" => "bar"} 

wie kann ich diese beiden Karten vergleichen?

Map.equal?(a, b) 

kehrt false

+0

vielleicht dies: http://learningwithjb.com/posts/the-many-different-ways-to-key-elixir-maps – dina

Antwort

2

Die Karten, die Sie haben, sind nicht in verschiedenen Formaten. Sie haben verschiedene Schlüssel.

iex(1)> Map.equal? %{"foo": 4}, %{:"foo" => 4} 
true 

Unter Verwendung des ersten ("foo":) ist nur kurze Hand zum Schreiben des zweiten (:"foo" =>)

Die aktuelle Map.equal?/2 Funktion, um sicherzustellen, sieht, dass die Schlüssel und Werte gleich sind.

In Elixir :"foo" ist ein Atom und "foo" ist eine Binärdatei (manchmal auch als String bezeichnet).

iex(1)> is_atom :"foo" 
true 
iex(2)> is_binary :"foo" 
false 
iex(3)> is_atom "foo" 
false 
iex(4)> is_binary "foo" 
true 

Aus diesem Grund Map.equal?/2 versagt, weil diese beiden Werte nicht gleich sind.

Wenn Sie sich jedoch nicht darum kümmern, dass die Typen unterschiedlich sind und nur mehr auf die "Inhalte" des Typs achten, können Sie alle Schlüssel (und vielleicht die Werte) in Zeichenfolgen konvertieren und dann vergleichen.

for {key, value} <- my_map do 
    {inspect(key), inspect(value)} 
end 

Bitte beachten Sie, dass Sie den obigen Code nicht in Karten Berücksichtigung verschachtelt dauert und es wird einfach blind in eine Zeichenfolge konvertieren, die kann oder auch nicht sein, was Sie tun wollen.

Leider würde dies bedeuten, dass Sie beide Karten mehrmals durchlaufen müssen. Einmal, um jede Karte zu konvertieren und dann erneut zu testen, ob sie gleich sind. Dies kann lange dauern, wenn eine der Karten ziemlich groß ist.

Halten Sie sich vorzugsweise daran, wie Map.equal?/2 funktioniert. Wenn die Schlüssel unterschiedlichen Typs sind, sollten sie nicht gleich sein. Wenn Sie es wirklich benötigen, können Sie die Konvertierung selbst durchführen.

+1

Ich denke, es lohnt sich zu betonen, dass ': foo ==:" foo "', Die Anführungszeichen dienen dazu, einige nicht standardisierte Zeichen zu verarbeiten. – nietaki

+0

Ja. Danke @Nietaki. Ein Beispiel für ein Nicht-Standard-Zeichen wäre ein Leerzeichen. Sie können nicht etwas mit einem Leerzeichen als ein Atom ohne die Anführungszeichen darstellen. –

Verwandte Themen