Dynamic elixir动态模块调用

Dynamic elixir动态模块调用,dynamic,module,elixir,Dynamic,Module,Elixir,如何在名为App.Reporting.Name的模块中调用函数func() 基于直到运行时才知道的字符串“name” 使用String.to_atom或to_现有_atom不起作用: alias App.Reporting.Name module = "name" |> String.capitalise |> String.to_atom apply(module, :func, []) 如果没有别名,这也不起作用 module = "App.Reporting.

如何在名为App.Reporting.Name的模块中调用函数func()

基于直到运行时才知道的字符串“name”

使用String.to_atom或to_现有_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”不可用)


谢谢

你的之所以不工作是因为
字符串。to_atom
就是这样做的,将字符串转换为原子。因为没有名为“App.Reporting.Name”的模块,所以很可能是
App.Reporting.Name
it错误

不确定这是否是最好的方法,只是突然想到的一种。但你可以这样做:

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

另一个解决方案可能是创建一个自动执行此过程的宏,但我并不擅长这一点,因此您必须仔细阅读该过程的文档。

您的第二种方法几乎是正确的,您只需要在
Elixir前面加前缀。
因为
App.Reporting.Name
等于
:“Elixir.App.Reporting.Name”
,而不是
:“App.Reporting.Name”
,因为Elixir在所有模块名称(名称以大写字母开头)前面加上
Elixir。
然后将其转换为atom:

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, [])