Elixir模式匹配协议实现者
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elixir模式匹配协议实现者相关的知识,希望对你有一定的参考价值。
您可以在方法中对特定结构进行模式匹配,以防止类型错误的泄漏。例如。 def f(z_struct = %Z{}) do ...
。
如果你不知道结构的类型,你可以做类似的事情,比方说,如果你想要一个实现协议P
的模块结构。
defprotocol P do
# ...
end
defmodule A do
defstruct :a
end
defimpl P, for: A do
# ...
end
defmodule B do
defstruct :b
end
defimpl P, for: B do
# ...
end
defmodule SomeMod do
def m(p) do
# ...
end
end
即方法SomeMod.m/1
应仅接受%A {}或%B {}作为参数。如果模块C
后来实现P
,m/1
应该接受C
而无需更改代码。
我们可以做这个灵药吗?
如果上面的解释不好,可以把它想象成接受Java中的接口,其中P
是接口,A
和B
是实现P
的类。
答案
在函数子句中使用保护/模式匹配是不可能的。断言这个的唯一方法是使用反射Kernel.impl_for/1
:
defmodule SomeMod do
def m(p) do
unless P.impl_for(p), do: raise MatchError, term: p
# ...
end
end
以上是关于Elixir模式匹配协议实现者的主要内容,如果未能解决你的问题,请参考以下文章
Phoenix/Elixir - 协议 Enumerable 未实现
Elixir HashDict (Protocol.UndefinedError) 协议 Enumerable 未为 1, 1, 1 实现