Как определить функции в основной области iex?

В файле ~/.iex.exs у меня есть модуль, определенный с несколькими функциями, и я хочу вызывать эти функции из оболочки iex без префикса имени модуля.

Использование import SomeModule не работает, я получаю сообщение об ошибке: module SomeModule is not loaded but was defined. This happens because you are trying to use a module in the same context it is defined. Try defining the module outside the context that requires it.

Есть ли способ сделать это в ~/.iex.exs?


person vmoravec    schedule 09.12.2015    source источник


Ответы (1)


Это известное ограничение механизма .iex.exs. Файл .iex.exs оценивается в том же контексте, что и тот, который вы вводите в оболочке: в основном, IEx загружает .iex.exs так же, как если бы вы вводили его в оболочке.

В Эликсире вы не можете определить модуль и импортировать его в том же контексте (например, вы не можете определить модуль в оболочке/в файле и импортировать его после этого), и именно это там и происходит.

Мой совет: определите модуль в .iex.exs и назовите его (все еще в .iex.exs) очень коротким именем. Например, в .iex.exs:

defmodule MyModule do
  def foo, do: :foo
end

alias MyModule, as: M

Затем в оболочке:

iex> M.foo
:foo

Это не оптимально, но сейчас это возможный компромисс.

person whatyouhide    schedule 09.12.2015
comment
Это то, что я в итоге сделал на самом деле. Я надеюсь, что однажды Elixir получит возможность определять функции вне модулей в iex. - person vmoravec; 10.12.2015