2016-04-13 42 views
2

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,爲什麼它不會在前兩個調用中引發錯誤?

回答

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 

可以看到地圖的其他情況下被轉化爲元組爲用下面的代碼可枚舉協議:

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

有點難以理解,但回答這個問題。謝謝。 – CrabMan

+0

我建議您也參閱入門指南中的協議頁面。 http://elixir-lang.org/getting-started/protocols.html – Gazler