Elixir模式匹配协议实现者

问题描述 投票:0回答:1

您可以在方法中对特定结构进行模式匹配,以防止类型错误的泄漏。例如。 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后来实现Pm/1应该接受C而无需更改代码。

我们可以做这个灵药吗?


如果上面的解释不好,可以把它想象成接受Java中的接口,其中P是接口,AB是实现P的类。

pattern-matching elixir protocols
1个回答
1
投票

在函数子句中使用保护/模式匹配是不可能的。断言这个的唯一方法是使用反射Kernel.impl_for/1

defmodule SomeMod do
  def m(p) do
    unless P.impl_for(p), do: raise MatchError, term: p
    # ...
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.