在elixir中实现行为的所有模块的列表

Arj*_*ngh 2 elixir

什么是获得实现行为的所有模块列表的最短方法?

例如

defmodule X do
  @callback foo()
end

defmodule A do
  @behaviour X
  def foo() do
    "hello"
  end
end

defmodule B do
  @behaviour X
  def foo() do
    "world"
  end
end
Run Code Online (Sandbox Code Playgroud)

我想得到一个清单[A,B].我尝试加载所有模块,然后使用key属性进行过滤,behaviour但我认为它会非常慢.还有其他更好的方法吗?

leg*_*cia 5

不,没有更好的方法.行为不以任何方式编制索引,因为它们是用于检查是否已定义所有必需回调函数的编译时功能.所以像这样的东西就像它得到的一样好:

for {module, _} <- :code.all_loaded(),
    X in (module.module_info(:attributes)[:behaviour] || []) do
        module
end
Run Code Online (Sandbox Code Playgroud)