Импорт функций динамически загружаемого модуля - PullRequest
1 голос
/ 10 ноября 2019

У меня есть следующие два файла:

# 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(), код будет работать без ошибок.

Итак, возможно ли каким-либо образом импортировать функции из динамически загружаемого модуля?

1 Ответ

4 голосов
/ 11 ноября 2019

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

...