2016-09-21 14 views
6

Tôi tự hỏi liệu có cách nào để hỏi Elixir liệu đối tượng này có triển khai giao thức, giống như obj |> implements(Enumerable) không?Làm cách nào để kiểm tra xem giao thức có được triển khai không?

Về cơ bản, tôi phải phân biệt cấu trúc và bản đồ. Giải pháp Tôi hiện đang có là kinda xấu xí:

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

Các công trình trên, nhưng tôi muốn sử dụng mô hình kết hợp như:

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

Tôi có thiếu cái gì? Có thể kiểm tra một cách rõ ràng xem giao thức mong muốn có được thực hiện bởi đối tượng không?

Trả lời

8

Bạn có thể kiểm tra xem Protocol.impl_for(term) lợi nhuận Nil hay không:

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

Perfect, cảm ơn. Tôi tự hỏi tại sao nó bị thiếu tại http://elixir-lang.org/docs/stable/elixir/Enumerable.html – mudasobwa

+0

Có lẽ vì https://github.com/elixir-lang/elixir/blob/d02be44dd5deb763e5a0eb03f3c716506d781d08/lib/elixir /lib/protocol.ex#L430. – Dogbert

Các vấn đề liên quan