导入动态加载模块的功能

我有以下两个文件:

# 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(),则代码可以正常运行。

那么,是否可以从动态加载的模块导入函数?

chifengbin 回答:导入动态加载模块的功能

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()

本文链接:https://www.f2er.com/3128268.html

大家都在问