2014-02-27 20 views
2

blank.ex是:Elixir`defprotocol`中的`Any`實際上包含了什麼?

defprotocol Blank do 
    @fallback_to_any true 
    def blank?(data) 
end 

defimpl Blank, for: Any do 
    def blank?(_), do: false 
end 

,我在IEX輸入,輸出爲:

iex(18)> Blank.blank? [] 
true 
iex(19)> Blank.blank? [6] 
false 
iex(20)> Blank.blank? '12' 
false 
iex(22)> Blank.blank? "' " 
true 
iex(23)> Blank.blank? "elixi" 
true 
iex(24)> Blank.blank? {1} 
true 
iex(25)> Blank.blank? {1, 2} 
true 
iex(26)> Blank.blank? 2 
false 

所以我不知道什麼是Any意味着在這種情況下?我得到了一些有趣的事情,天氣與否我使用這樣的實現

defimpl Blank, for: Any do 
    def blank?(_), do: false 
end 

和iex的輸出之前它是相同的。這是否意味着這個實現什麼都不做?或者我錯過了什麼?

回答

3

Any子句應該在未提供實現的情況下調用。

我不知道爲什麼你會得到這些奇怪的結果,但我懷疑你在shell會話中有一些不正確的定義。我曾嘗試與example from the site

defprotocol Blank do 
    @fallback_to_any true 
    def blank?(data) 
end 

defimpl Blank, for: Integer do 
    def blank?(_), do: false 
end 

# Just empty list is blank 
defimpl Blank, for: List do 
    def blank?([]), do: true 
    def blank?(_), do: false 
end 

# Just the atoms false and nil are blank 
defimpl Blank, for: Atom do 
    def blank?(false), do: true 
    def blank?(nil), do: true 
    def blank?(_),  do: false 
end 

defimpl Blank, for: Any do 
    def blank?(_), do: false 
end 

,並得到預期的結果:

iex(1)> Blank.blank? "' " 
false 

iex(2)> Blank.blank? "elixi" 
false 

iex(3)> Blank.blank? [] 
true 

iex(4)> Blank.blank? {} # fallback to Any 
false 

最後一個例子是回退到Any,因爲該協議沒有爲一個元組定義。如果刪除Any落實,重啓殼,你應該得到一個錯誤:

iex(1)> Blank.blank? {} 
** (Protocol.UndefinedError) protocol Blank not implemented for {} 
0

我知道什麼是我的困惑。我也開始使用example this site。首先我blank.ex

defprotocol Blank do 
    def blank?(data) 
end 

defimpl Blank, for: Integer do 
    def blank?(_), do: false 
end 

defimpl Blank, for: List do 
    def blank?([]), do: true 
    def blank?(_), do: false 
end 

後,我編譯elixirc blank.ex,它會創建這些文件梁:

Elixir.Blank.Integer.beam Elixir.Blank.List.beam Elixir.Blank.beam 

其次我blank.ex

defprotocol Blank do 
    @fallback_to_any true 
    def blank?(data) 
end 

defimpl Blank, for: Any do 
    def blank?(_), do: true 
end 

我再次編譯它,我得到了這些束文件:

Elixir.Blank.Any.beam Elixir.Blank.Integer.beam Elixir.Blank.List.beam Elixir.Blank.beam 

它不會刪除Elixir.Blank.Integer.beam Elixir.Blank.List.beam文件,當我在IEX運行:

iex(18)> Blank.blank? [] # it uses Elixir.Blank.List.beam 
true 
iex(19)> Blank.blank? [6] # it uses Elixir.Blank.List.beam 
false 
iex(20)> Blank.blank? '12' # it uses Elixir.Blank.List.beam 
false 
iex(22)> Blank.blank? "' " # it uses Elixir.Blank.Any.beam 
true 
iex(23)> Blank.blank? "elixi" # it uses Elixir.Any.List.beam 
true 
iex(24)> Blank.blank? {1} # it uses Elixir.Blank.Any.beam 
true 
iex(25)> Blank.blank? {1, 2} # it uses Elixir.Blank.Any.beam 
true 
iex(26)> Blank.blank? 2 # it uses Elixir.Blank.Integer.beam 
false 

所以這只是因爲我的手動刪除舊梁文件的丟失。

相關問題