gpt4 book ai didi

elixir - 跟踪 `use` 另一个模块的模块

转载 作者:行者123 更新时间:2023-12-01 12:20:27 25 4
gpt4 key购买 nike

我试图跟踪所有在编译时使用另一个模块的模块,并在运行时获取所有这些模块的列表:

defmodule BaseModule do
defmacro __using__(_) do
quote do
# common behaviour
end
end
end


defmodule A do
use BaseModule
end

defmodule B do
use BaseModule
end

defmodule C do
use BaseModule
end

并在运行时通过调用这样的东西来获取它们:

BaseModule.children()
#=> [A, B, C]

我一直在努力寻找一种方法来实现这一点,但仍然完全不知道该怎么做。通过this thread on the elixir-lang mailing list , @josevalim建议使用 Protocols 来做到这一点。但是在为此苦苦挣扎了大约一个小时之后,我也无法让它与协议(protocol)一起工作。

我也一直在研究 Registry 模块,看看我是否可以使用它来完成这个,但看起来它主要是为处理进程而设计的。

任何帮助将不胜感激。提前致谢!

最佳答案

如果您的基本模块使用行为,则可以采用以下解决方案。

defmodule BaseModule do
@callback foo() :: any()

defmacro __using__(_opts) do
quote do
# Fairly standard to use a behaviour and gives us something to detect later.
@behaviour unquote(__MODULE__)

# Any other setup required
end
end

def children() do
(for {module, _} <- :code.all_loaded(), do: module)
|> Enum.filter(&is_child?/1)
end

def is_child?(module) do
module.module_info[:attributes]
|> Keyword.get(:behaviour, [])
|> Enum.member?(__MODULE__)
end
end

defmodule A do
use BaseModule
end

BaseModule.children()
#=> [A]

关于elixir - 跟踪 `use` 另一个模块的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44730957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com