我有以下两个文件:
# 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()
。