您可以在方法中对特定结构进行模式匹配,以防止类型错误的泄漏。例如。 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