是否可以通过字符串或符号动态访问模块?

时间:2015-09-09 04:45:15

标签: elixir

我试图编写一组宏,所有这些宏都必须依赖于有关同一模块的知识,因此,我试图避免将此模块明确地传递给每个函数(I&# 39;实际上这样做很好,但是当我学习语言时,我试图探索所有可能性!)。

所以我写作(目标是访问SomeOtherModule,或在生成的SomeOtherModule.foo函数中调用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__访问当前模块,但我正在寻找一种方法来访问任何现有模块,而不仅仅是当前模块。

1 个答案:

答案 0 :(得分:11)

使用Module.concat(module_path)而不是手动加入路径,因为它是为此目的。