2016-09-21 9 views
6

मुझे आश्चर्य है कि क्या Elixir से पूछने का कोई तरीका है कि यह ऑब्जेक्ट उस प्रोटोकॉल को लागू करता है, obj |> implements(Enumerable) जैसे कुछ?मैं कैसे जांच सकता हूं कि प्रोटोकॉल लागू किया गया है या नहीं?

असल में, मुझे structs और नक्शे को अलग करना होगा। समाधान मैं वर्तमान में है थोड़े बदसूरत है:

try 
    obj |> Enum.each ... 
rescue 
    e in Protocol.UndefinedError -> obj |> Maps.keys ... 
end 

ऊपर काम करता है, लेकिन मैं पैटर्न की तरह मिलान का उपयोग करना पसंद करेंगे:

cond do 
    obj |> is_implemented(Enumerable) -> ... 
    _ -> ... 
end 

मैं कुछ याद आ रही है? क्या कोई स्पष्ट रूप से जांच सकता है कि वांछित प्रोटोकॉल ऑब्जेक्ट द्वारा कार्यान्वित किया गया है या नहीं?

उत्तर

8

आप देख सकते हैं Protocol.impl_for(term) रिटर्न शून्य या नहीं:

iex(1)> Enumerable.impl_for [] 
Enumerable.List 
iex(2)> Enumerable.impl_for {} 
nil 
iex(3)> Enumerable.impl_for MapSet.new 
Enumerable.MapSet 
+1

बिल्कुल सही है, धन्यवाद। मुझे आश्चर्य है कि यह क्यों गायब है http://elixir-lang.org/docs/stable/elixir/Enumerable.html – mudasobwa

+0

शायद https://github.com/elixir-lang/elixir/blob/d02be44dd5deb763e5a0eb03f3c716506d781d08/lib/elixir की वजह से /lib/protocol.ex#L430। – Dogbert

संबंधित मुद्दे

 संबंधित मुद्दे