我有以下两个文件:
# 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()
,则代码可以正常运行。
那么,是否可以从动态加载的模块导入函数?
答案 0 :(得分:4)
Elixir是一种编译语言,甚至具有.exs
扩展名和称为 script 的语言也应在执行之前编译为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()
。