Protocols 是否可以找到实现特定协议的所有模块?

Protocols 是否可以找到实现特定协议的所有模块?,protocols,elixir,Protocols,Elixir,我想知道是否有可能找到所有具有特定模块实现的模块 我有一个简单的协议: defprotocol Ep.PerformTest do @doc "Should return tupple {out, time}" def test(struct) end defmodule Ep.Test.Rexcpp do defstruct [:input, :code, :output] def displayName(), do: "Rextester C++" defimpl

我想知道是否有可能找到所有具有特定模块实现的模块

我有一个简单的协议:

defprotocol Ep.PerformTest do
  @doc "Should return tupple {out, time}"
  def test(struct)
end
defmodule Ep.Test.Rexcpp do
  defstruct [:input, :code, :output]

  def displayName(), do: "Rextester C++"

  defimpl Ep.PerformTest, for: Ep.Test.Rexcpp do
    def test(struct) do

    end
  end
end
还有几个模块实现了此协议:

defprotocol Ep.PerformTest do
  @doc "Should return tupple {out, time}"
  def test(struct)
end
defmodule Ep.Test.Rexcpp do
  defstruct [:input, :code, :output]

  def displayName(), do: "Rextester C++"

  defimpl Ep.PerformTest, for: Ep.Test.Rexcpp do
    def test(struct) do

    end
  end
end
似乎就是你要找的

从给定路径中提取为给定协议实现的所有类型

感谢OP的评论,下面是问题中示例的代码:

path = :code.lib_dir(:protocol_test, :ebin)
mods = Protocol.extract_impls(Ep.PerformTest, [path])
由于我们在这里调用模块以获取路径,因此模块名称必须采用Erlang使用的atom格式。

您正在寻找该方法。从文档中:

\uuuu协议\uuuu/1
-返回协议信息。该函数采用以下原子之一:

  • :impls
    -如果合并,则返回
    {:consolidated,modules}
    以及实现协议的模块列表,否则返回
    :not_consolidated

  • [……]


示例:

iex>String.Chars.\uuuuuuuuuuuuuuuuuuuuuuuuuu协议(:impls)
#=>{:consolidated[Postgrex.Copy,Postgrex.Query,十进制,浮点,DateTime,Time,List,Version.Requirement,Atom,Integer,Version,Date,BitString,NaiveDateTime,URI]}

作为第二个参数,我应该传递:code.all\u loaded()?我认为情况并非如此。根据文档iex>path=:code.lib_dir(:elixir,:ebin),该路径包含指向elixir devkit位置的路径请尝试一下,看看它是否有效。我真的不知道paths参数应该是什么。不知道,但是:lib_dir(:mymodulename,:ebin)作为我使用的第一个参数:ep工作,因为我的模块名为ep。