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后来实现Pm/1应该接受C而无需更改代码。

我们可以做这个灵药吗?


如果上面的解释不好,可以把它想象成接受Java中的接口,其中P是接口,AB是实现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模式匹配协议实现者的主要内容,如果未能解决你的问题,请参考以下文章

Elixir:模式匹配对元组和映射的工作方式不同

协议可枚举未实现 - Elixir

Phoenix/Elixir - 协议 Enumerable 未实现

Elixir HashDict (Protocol.UndefinedError) 协议 Enumerable 未为 1, 1, 1 实现

大神来了Elixir语言设计者José Valim:释放Erlang VM的能量

Elixir零小时时间为24