gpt4 book ai didi

elixir - 查找所有采用行为的模块

转载 作者:行者123 更新时间:2023-12-04 23:17:34 25 4
gpt4 key购买 nike

是否有可能找到每个加载的模块都采用了某种行为?

我正在构建一个非常简单的聊天机器人,我想制作一些很酷的命令,但要实现这一点,我需要一种实现多个命令的方法,最好不要对它们进行硬编码。

每个命令都是一个函数,它接受三个参数(message、author、chat_channel_ref)并返回 true 或 false 是否匹配并执行某些操作。

当我浏览 Elixir 教程时,我发现 Behaviors如果我能找到所有采用它们的模块,这可能会很好地满足我的需求。你们有人以前做过吗?我还能做什么?我还考虑过“使用”(在使用中我会执行代码以将当前模块添加到代理持有的列表中)。

最佳答案

这是我的 exrm 项目的摘录,它基本上就是这样做的:它找到任何实现插件行为的模块:

  @doc """
Loads all plugins in all code paths.
"""
@spec load_all() :: [] | [atom]
def load_all, do: get_plugins(ReleaseManager.Plugin)

# Loads all modules that extend a given module in the current code path.
@spec get_plugins(atom) :: [] | [atom]
defp get_plugins(plugin_type) when is_atom(plugin_type) do
available_modules(plugin_type) |> Enum.reduce([], &load_plugin/2)
end

defp load_plugin(module, modules) do
if Code.ensure_loaded?(module), do: [module | modules], else: modules
end

defp available_modules(plugin_type) do
# Ensure the current projects code path is loaded
Mix.Task.run("loadpaths", [])
# Fetch all .beam files
Path.wildcard(Path.join([Mix.Project.build_path, "**/ebin/**/*.beam"]))
# Parse the BEAM for behaviour implementations
|> Stream.map(fn path ->
{:ok, {mod, chunks}} = :beam_lib.chunks('#{path}', [:attributes])
{mod, get_in(chunks, [:attributes, :behaviour])}
end)
# Filter out behaviours we don't care about and duplicates
|> Stream.filter(fn {_mod, behaviours} -> is_list(behaviours) && plugin_type in behaviours end)
|> Enum.uniq
|> Enum.map(fn {module, _} -> module end)
end

关于elixir - 查找所有采用行为的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433481/

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