2015-09-09 3 views
6

私は同じモジュールについての知識に依存しなければならない一連のマクロを書こうとしているので、このモジュールを各関数に明示的に渡すことを避けようとしています(実際にはだから、私は言語を学んでいるので、私はすべての可能性を探そうとしている!)。モジュールを文字列やシンボルで動的にアクセスできますか?

だから私は(目標はSomeOtherModuleにアクセスし、または生成foo関数の内部SomeOtherModule.fooを呼び出すことがある。)書いて

defmodule MacrosUser do 
    use MyMacros, SomeOtherModule 
end 

defmodule MyMacros do 
    defmacro __using__(opts) do 
    {:__aliases__, _, module_path} = opts 
    quote do 
     def foo do 
     module_path 
     |> Enum.join(".") 
     |> apply(:foo, []) 
     end 
    end 
    end 
end 

しかし、これは明らかにapply/3として機能していないモジュールではなく、文字列を期待またはモジュールの名前のシンボル表現。

基本的に、タイトルには、特定の文字列や記号に対して、対応するモジュールにアクセスしたり、そのモジュールの関数を呼び出すような方法を探しています。

また、__MODULE__を介して現在のモジュールにアクセスすることは可能ですが、現在のモジュールだけでなく、既存のモジュールにアクセスする方法も探しています。

+0

「MyMacros」、「__MODULE__ == MyMacros ==: "Elixir.MyMacros"」という文脈の中にあるとき。 –

+0

はい、わかっています。この例では、 'SomeOtherModule'にアクセスして' __using__'フックに渡す方法を探していました。私はおそらく質問を更新する必要があります。 – user2205259

答えて

11

この目的のために、パスを手動で結合する代わりにModule.concat(module_path)を使用してください。

+3

完璧な答え。また、エリクサーが暗黙的に明示的に好むように、開発者はこのアプローチを避けるべきであるという免責事項を追加する価値があります。さらに、このアプローチは多くの場合安全ではないかもしれません。最初のものは原子であり、モジュール名はガベージコレクションされます。 –

関連する問題