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

use*_*259 6 elixir

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

所以我正在写(目标是访问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
Run Code Online (Sandbox Code Playgroud)

但是这显然不像apply/3预期的模块那样工作,也不是模块名称的字符串或符号表示.

基本上,正如标题所说,我正在寻找一些方法来使它对于给定的字符串或符号它将访问相应的模块或调用该模块的功能.

此外,我知道可以通过__MODULE__宏访问当前模块,但我正在寻找一种方法来访问任何现有模块,而不仅仅是当前模块.

bit*_*ker 11

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

  • 完美答案.同样值得添加免责声明,开发人员应尽可能避免这种方法,因为Elixir倾向于明确过度隐含.此外,这种方法在许多场合可能并不安全,第一种方法是原子和模块名称是垃圾收集. (3认同)