是否可以通过字符串或符号动态访问模块?
Is it possible to dynamically access module by string or symbol?
我正在尝试编写一组宏,所有这些宏都必须依赖于对同一模块的了解,因此,我试图避免将此模块显式传递给每个函数(实际上我这样做很好,但是在我学习这门语言的过程中,我正在尝试探索所有的可能性!)。
所以我正在写(目标是访问 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__
访问当前模块,但我正在寻找一种方法来访问任何现有模块,而不仅仅是当前模块。
使用 Module.concat(module_path)
而不是手动加入路径,因为它就是为此目的而设计的。
我正在尝试编写一组宏,所有这些宏都必须依赖于对同一模块的了解,因此,我试图避免将此模块显式传递给每个函数(实际上我这样做很好,但是在我学习这门语言的过程中,我正在尝试探索所有的可能性!)。
所以我正在写(目标是访问 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__
访问当前模块,但我正在寻找一种方法来访问任何现有模块,而不仅仅是当前模块。
使用 Module.concat(module_path)
而不是手动加入路径,因为它就是为此目的而设计的。