如何在iex主范围中定义函数?

时间:2015-12-09 15:13:18

标签: elixir iex

在文件~/.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

中执行此操作

1 个答案:

答案 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

这不是最佳,但现在,这可能是妥协。