【问题标题】:Elixir List All Modules in NamespaceElixir 列出命名空间中的所有模块
【发布时间】:2017-01-19 18:01:06
【问题描述】:

我正在开发一个 Elixir/Phoenix 应用程序,该应用程序旨在在我的 UserController 控制器中创建一个用户。有一个 /lib/helpers/user_helpers 目录,其中包含许多模块(每个模块都在一个单独的文件中)。这些模块都有一个共同的命名空间UserHelpers.ModuleName。在每个模块中,我都有一个名为apply 的函数,我想将其应用于用户数据。例如,如果我有以下文件结构:

-lib
    -helpers
        -user_helpers
            -module1
            -module2
            -...
            -moduleN-1
            -moduleN

module1module2 中的每一个都包含一个函数 apply(user_info),它返回 user_info。在我的UserController 中,我有函数create(conn, params),我想在其中运行以下命令:

user_data
|> UserHelpers.Module1.create
|> UserHelpers.Module2.create
|> ...
|> UserHelpers.ModuleN-1.create
|> UserHelpers.ModuleN.create

但我不确定如何动态加载UserHelpers 文件夹中的所有模块来执行上述操作。有什么建议吗?

【问题讨论】:

  • 这些模块是否编译到您的应用程序中(即它们是否在.ex 文件中而不是.exs 中)?
  • 你希望这些被调用的顺序是什么?模块名称是否以数字结尾?是 N > 9(在这种情况下 Enum.sort 是不够的)。

标签: erlang elixir phoenix-framework


【解决方案1】:

假设您的应用程序名为 :my_app 并且助手具有 .ex 扩展名和/或显式编译到您的应用程序中:

with {:ok, list} <- :application.get_key(:my_app, :modules) do
  list
  |> Enum.filter(& &1 |> Module.split |> Enum.take(1) == ~w|UserHelpers|)
  |> Enum.reduce(user_data, fn m, acc -> apply(m, :create, acc) end)
end

:application.get_key(:my_app, :modules) 返回该应用程序已知的模块列表。第二行过滤掉那些不需要的,后一行随后将它们的:create 函数应用于user_data

您可能希望在最后一行之前嵌入Enum.sort,以便按照适当的顺序对模块进行排序。

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 2018-05-21
    • 2016-04-24
    • 2014-12-11
    • 2020-01-02
    • 2016-05-17
    • 2018-01-27
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多