导入动态加载模块的函数



我有以下两个文件:

# script.exs
Code.eval_file("module.ex");
import MyModule # Doesn't work
my_function() # What I want
# module.ex
defmodule MyModule do
def my_function() do
IO.puts "My Function"
end
end

当运行elixir script.exs时,它会出错,并显示以下消息:

** (CompileError) script.exs:3: module MyModule is not loaded and could not be found

但是,如果要编写MyModule.my_function(),则代码运行时不会出现错误。

那么,是否有可能从动态加载的模块中导入函数呢?

Elixir是一种编译语言,即使是具有.exs扩展名的语言和所谓的脚本,也要在执行前编译到BEAM中。

问题是import MyModule无法编译,因为编译器目前对此模块一无所知。好消息是我们可能会愚弄编译器。

将您需要的所有代码放入一个单独的文件中:

# script.ex
import MyModule
my_function()

并使用runner.exs脚本,该脚本将编译以下两者:

# runner.exs
Code.eval_file("module.ex")
# IO.inspect Code.ensure_loaded(MyModule)
Code.eval_file("script.ex")

现在runner.exs很乐意调用my_function()

最新更新