2016-12-27 38 views
1

我如何可以調用函數func()被稱爲App.Reporting.Name仙丹動態模塊調用

基於這是不知道,直到使用String.to_atom或運行時

字符串「名」模塊中to_existing_atom不起作用:

alias App.Reporting.Name 
module = "name" |> String.capitalise |> String.to_atom  
apply(module, :func, []) 

沒有別名,這並不工作,要麼

module = "App.Reporting.Name" |> String.to_atom  
apply(module, :func, []) 

我得到一個(UndefinedFunctionError)和(模塊:「App.Reporting.Name」不可用)

感謝

回答

-1

原因你不工作是因爲String.to_atom做到了這一點,把一個字符串轉換成一個原子。因爲沒有稱爲「App.Reporting.Name」的模塊,所以它最有可能是App.Reporting.Name它的錯誤。

不知道這是否是最好做到這一點,只是一個想起來。但是你可以做這樣的事情:

iex(2)> module = "Casing" 
"Casing" 
iex(3)> Module.concat(String, "#{module}") |> apply(:upcase, ["test sentence"]) 
"TEST SENTENCE" 

另一種解決辦法是建立一個宏,自動完成這一過程,但是這是不是我,偉大的,所以你將不得不通過文檔here爲那個。

5

你的第二個方法幾乎是正確的,你只需要前綴Elixir.因爲App.Reporting.Name等於:"Elixir.App.Reporting.Name",不:"App.Reporting.Name"因爲藥劑前綴與Elixir.所有模塊的名稱(從大寫字母的名字)把它變成一個原子之前:

iex(1)> App.Reporting.Name == :"App.Reporting.Name" 
false 
iex(2)> App.Reporting.Name == :"Elixir.App.Reporting.Name" 
true 

所以,這個代碼應工作:

module = "Elixir.App.Reporting.Name" |> String.to_atom  
apply(module, :func, []) 

,因此應該這樣:

module = Module.concat(App.Reporting, "name" |> String.capitalize |> String.to_atom) 
apply(module, :func, [])