簡體   English   中英

Elixir列出命名空間中的所有模塊

[英]Elixir List All Modules in Namespace

我正在開發一個Elixir / Phoenix應用程序,用於在UserController控制器中創建用戶。 有一個/lib/helpers/user_helpers目錄,其中包含許多模塊(每個模塊都在一個單獨的文件中)。 這些模塊都有一個共同的命名空間UserHelpers.ModuleName 在每個模塊中,我都有一個名為apply的函數,我想將其應用於用戶數據。 例如,如果我有以下文件結構:

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

其中module1module2中的每一個都包含一個返回user_info的函數apply(user_info) 在我的UserController我有函數create(conn, params) ,我想在其中運行以下命令:

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

但我不確定如何動態加載UserHelpers文件夾中的所有模塊來執行上述操作。 有什么建議么?

假設您的應用程序被調用:my_app和helpers具有.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 ,以便按適當的順序對要應用的模塊進行排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM