我在长生不老药中使用地图。
有些%{"foo": "bar"}格式
有些在 %{"foo" => "bar"}
我有两张地图:
a = %{"foo": "bar"}
b = %{"foo" => "bar"}
Run Code Online (Sandbox Code Playgroud)
如何比较这两张地图?
Map.equal?(a, b)
Run Code Online (Sandbox Code Playgroud)
退货 false
您拥有的地图格式不同。它们具有不同的键。
iex(1)> Map.equal? %{"foo": 4}, %{:"foo" => 4}
true
Run Code Online (Sandbox Code Playgroud)
使用第一个("foo":)只是编写第二个(:"foo" =>)的捷径
当前Map.equal?/2功能看起来是要确保键和值相同。
在Elixir :"foo"中,原子是一个原子,并且"foo"是二进制(有时也称为字符串)。
iex(1)> is_atom :"foo"
true
iex(2)> is_binary :"foo"
false
iex(3)> is_atom "foo"
false
iex(4)> is_binary "foo"
true
Run Code Online (Sandbox Code Playgroud)
这就是Map.equal?/2失败的原因,因为这两个值不相同。
但是,如果您不关心类型的不同,而只关心类型的“内容”,则可以将所有键(可能还有值)转换为字符串,然后进行比较。
for {key, value} <- my_map do
{inspect(key), inspect(value)}
end
Run Code Online (Sandbox Code Playgroud)
请注意,上面的代码没有考虑嵌套映射,只会盲目地将其转换为字符串,这可能是您可能要做的,也可能不是。
不幸的是,这意味着您将需要遍历两个地图多次。一次转换每个图,然后再次测试它们是否相等。如果其中任何一张地图都很大,可能会花费很长时间。
最好坚持如何Map.equal?/2工作。如果键的类型不同,则它们不应相等。不过,如果确实需要,您可以自己进行转换。
| 归档时间: |
|
| 查看次数: |
1374 次 |
| 最近记录: |