如何检查协议是否已实现?

时间:2016-09-21 06:46:42

标签: elixir

我想知道是否有办法向Elixir询问此对象是否实现了该协议,类似于obj |> implements(Enumerable)

基本上,我必须区分结构和地图。我目前的解决方案有点难看:

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

上述工作,但我更喜欢使用模式匹配,如:

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

我错过了什么吗? 可以明确检查对象是否实现了所需的协议吗?

1 个答案:

答案 0 :(得分:10)

您可以检查Protocol.impl_for(term)是否返回nil:

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