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.
vielleicht dies: http://learningwithjb.com/posts/the-many-different-ways-to-key-elixir-maps – dina