2017-07-19 7 views

Antwort

5

match?/2 ist ein Makro und sein erstes Argument ist ein Muster, kein Wert. Im ersten Code-Snippet testen Sie, ob das Muster test mit dem Wert map übereinstimmt. Dies ist der Fall, da test eine Kennung ist und mit einem beliebigen Wert übereinstimmt. Wenn Sie den gleichen Code in das Modul/iex verwenden, werden sie identische Ergebnisse geben:

defmodule CompareMaps do 
    def match do 
    match? %{a: 3}, %{a: 2, b: 3, c: 4} 
    end 
end 
iex(1)> CompareMaps.match 
=> true 

und

iex(1)> map = %{a: 2, b: 3, c: 4} 
%{a: 2, b: 3, c: 4} 
iex(2)> test = %{a: 3} 
%{a: 3} 
iex(3)> match? test, map 
true 
+0

Was ein guter Weg ist, Karten zu vergleichen, wenn ich Muster versuchen Matching und sie nicht übereinstimmen Elixier wirft einen Fehler? Muss ich Schlüsselwerte einzeln durchlaufen und vergleichen? –

+1

Ja, Sie müssen die Überprüfung selbst durchführen. Es ist nicht viel Code: 'Enum.all? (Test, fn {k, v} -> map [k] == v Ende) # => false',' Enum.all? (% {A: 2, b: 3}, fn {k, v} -> Karte [k] == v Ende) # => wahr '. – Dogbert

Verwandte Themen