繁体   English   中英

药剂动态模块调用

[英]elixir dynamic module call

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

基于字符串“名称”,直到运行时才知道

使用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”不可用)

谢谢

您的第二种方法几乎是正确的,您只需要在Elixir.前面Elixir.前缀即可Elixir. 因为App.Reporting.Name等于:"Elixir.App.Reporting.Name" ,而不是:"App.Reporting.Name"因为Elixir用Elixir前缀所有模块名称(以大写字母开头的名称) 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, [])

您的计算机不工作的原因是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"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM