`in`运算符如何处理地图?

时间:2016-04-13 10:59:59

标签: elixir

in运算符如何使用地图?

iex(12)> "a" in %{"a" => "b"}
false
iex(13)> "b" in %{"a" => "b"}
false
iex(14)> {"a", "b"} in %{"a" => "b"}
true
iex(15)> {"a", "a"} in %{"a" => "b"}
false

如果仅对表示键和值的元组返回true,为什么它不会在前两次调用中引发错误?

1 个答案:

答案 0 :(得分:5)

如果您查看in/2的文档,请说明:

  

此运算符(它是一个宏)只是转换为对Enum.member?/ 2的调用。

Enum.member?/2适用于任何Enumberable。

地图的可枚举协议需要

The implementation of member?/2

  def member?(map, {key, value}) do
    {:ok, match?({:ok, ^value}, :maps.find(key, map))}
  end

  def member?(_map, _other) do
    {:ok, false}
  end

您可以使用以下代码查看其他地图实例转换为Enumerable协议的元组:

iex(4)> Enum.map(%{"a" => "b", 1 => 2}, & &1)
[{1, 2}, {"a", "b"}]