3

在文件~/.iex.exs中,我有一个定义了几个函数的模块,我想从iexshell 调用这些函数,而不需要模块名称前缀。

使用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

4

1 回答 1

4

这是该.iex.exs机制的已知限制。该.iex.exs文件在与您在 shell 中键入内容的上下文相同的上下文中进行评估:基本上,IEx 加载.iex.exs就像您在 shell 中键入它一样。

在 Elixir 中,您不能定义一个模块并将其导入到相同的上下文中(例如,您不能在 shell/文件中定义一个模块然后再导入它),这就是那里发生的事情。

我的建议是:将模块定义为 in.iex.exs并将其(仍在 中.iex.exs)定义为一个非常短的名称。例如,在.iex.exs

defmodule MyModule do
  def foo, do: :foo
end

alias MyModule, as: M

然后,在外壳中:

iex> M.foo
:foo

这不是最佳的,但现在,它是一个可能的妥协。

于 2015-12-09T16:17:50.723 回答