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

Cra*_*Man 2 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
Run Code Online (Sandbox Code Playgroud)

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

Gaz*_*ler 5

如果你看一下in/2的文档,它说:

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

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

member?/2地图的Enumerable协议所需的实现:

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

  def member?(_map, _other) do
    {:ok, false}
  end
Run Code Online (Sandbox Code Playgroud)

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

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