[英]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.