我想知道是否有办法向Elixir询问此对象是否实现了该协议,类似于obj |> implements(Enumerable)
?
基本上,我必须区分结构和地图。我目前的解决方案有点难看:
try
obj |> Enum.each ...
rescue
e in Protocol.UndefinedError -> obj |> Maps.keys ...
end
上述工作,但我更喜欢使用模式匹配,如:
cond do
obj |> is_implemented(Enumerable) -> ...
_ -> ...
end
我错过了什么吗? 可以明确检查对象是否实现了所需的协议吗?
答案 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