您可以在方法中匹配特定结构的模式,以防止类型错误的一些泄漏。例如。 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
是实现{{1}的类}。
答案 0 :(得分:1)
在函数子句中使用保护/模式匹配是不可能的。断言这一点的唯一方法是使用反射Kernel.impl_for/1
:
defmodule SomeMod do
def m(p) do
unless P.impl_for(p), do: raise MatchError, term: p
# ...
end
end