在文件~/.iex.exs
中我有一个定义了多个函数的模块,我想从iex
shell调用那些没有模块名称前缀的函数。
使用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
?
答案 0 :(得分:4)
这是.iex.exs
机制的已知限制。 .iex.exs
文件的评估环境与你在shell中输入的内容相同:基本上,IEx加载.iex.exs
,就像你在shell中输入一样。
在Elixir中,你不能定义一个模块并在相同的上下文中导入它(例如,你不能在shell /文件中定义一个模块并在之后导入它),那就是那里发生的事情。
我的建议是:在.iex.exs
中定义模块,并将其别名(仍在.iex.exs
中)替换为一个非常短的名称。例如,在.iex.exs
:
defmodule MyModule do
def foo, do: :foo
end
alias MyModule, as: M
然后,在shell中:
iex> M.foo
:foo
这不是最佳,但现在,这可能是妥协。