Список всех модулей, реализующих поведение в эликсире - PullRequest
0 голосов
/ 05 декабря 2018

Каким может быть самый короткий способ получить список всех модулей, реализующих поведение?

Например,

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

Я хотел бы получить список как [A,B].Я попытался загрузить все модули и затем выполнить фильтрацию с использованием ключевого атрибута behaviour, но я думаю, что он будет очень медленным.Есть ли другой способ лучше?

1 Ответ

0 голосов
/ 05 декабря 2018

Нет, лучшего способа нет.Поведения никоим образом не индексируются, так как они являются функцией времени компиляции, используемой для проверки того, что все необходимые функции обратного вызова были определены.Так что-то вроде этого так хорошо, как это получается:

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