2016-12-27 12 views
1

にはどうすればString.to_atomかを使用して、実行時エリキシル動的モジュールコール

まで知られていない文字列「名前」に基づいて

App.Reporting.Name

と呼ばれるモジュールに()関数funcを呼び出すことができます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」が使用できません)String.to_atomのに文字列を回すだけで、あることないので、あなたが働いていない理由がある

おかげ

答えて

-1

を原子。 "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":"Elixir.App.Reporting.Name"に等しいプレフィックスする必要があります。

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, []) 
関連する問題