当前位置:  开发笔记 > 编程语言 > 正文

Elixir列出命名空间中的所有模块

如何解决《Elixir列出命名空间中的所有模块》经验,为你挑选了1个好方法。

我正在开发一个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文件夹中的所有模块来执行上述操作.有什么建议?



1> Aleksei Mati..:

假设您的应用程序被调用: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在最后一行之前嵌入以按适当顺序对模块进行排序.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有