Elixir模式匹配协议实现者

时间:2018-01-03 09:10:31

标签: pattern-matching elixir protocols

您可以在方法中匹配特定结构的模式,以防止类型错误的一些泄漏。例如。 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是接口,AB是实现{{1}的类}。

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