[英]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
其中module1
和module2
中的每一個都包含一個返回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.