是否有可能找到实现某些协议的所有模块?

Hai*_*ito 7 protocols elixir

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

我有一个简单的协议:

defprotocol Ep.PerformTest do
  @doc "Should return tupple {out, time}"
  def test(struct)
end
Run Code Online (Sandbox Code Playgroud)

并且很少有具有此协议实现的模块:

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
Run Code Online (Sandbox Code Playgroud)

Cod*_*nis 7

Protocol.extract_impls/2似乎是您正在寻找的.

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

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

path = :code.lib_dir(:protocol_test, :ebin)
mods = Protocol.extract_impls(Ep.PerformTest, [path])
Run Code Online (Sandbox Code Playgroud)

由于我们在这里调用Erlang:code模块来获取路径,因此模块名称需要采用Erlang使用的原子格式.