iex,如何有效地重新加载结构?

时间:2016-06-30 04:29:16

标签: elixir iex

我找到了一个最小的例子,显示了我在学习Elixir时遇到的一个问题。

我写了一个剧本:

defmodule P do
  defstruct a: 2
  def geta(%P{a: a}), do: a
end

使用iex "filename"开始iex会话检查它是否适用于P.geta(%P{a: 42})

然后我将文件更改为

defmodule P do
  defstruct a: 2, b: 4
  def getb(%P{a: a, b: b}), do: b
end

当我启动iex时,它失败了:

== Compilation error on file p.ex ==
** (CompileError) p.ex:3: unknown key :b for struct P
    (elixir) src/elixir_map.erl:185: :elixir_map."-assert_struct_keys/5-lc$^0/1-0-"/5
    (elixir) src/elixir_map.erl:62: :elixir_map.translate_struct/4
    (stdlib) lists.erl:1353: :lists.mapfoldl/3

** (exit) shutdown: 1
    (elixir) lib/kernel/parallel_compiler.ex:202: Kernel.ParallelCompiler.handle_failure/5
    (elixir) lib/kernel/parallel_compiler.ex:185: Kernel.ParallelCompiler.wait_for_messages/8
    (elixir) lib/kernel/parallel_compiler.ex:55: Kernel.ParallelCompiler.spawn_compilers/3
       (iex) lib/iex/helpers.ex:168: IEx.Helpers.c/2

我可以通过删除除定义之外的文件内容,启动iex,粘贴文件内容并重新启动iex来解决它。 它看起来好像旧的结构是由iex 缓存

两个问题:

  • 这是错误还是设计决定?
  • 有更巧妙的解决方法吗?

1 个答案:

答案 0 :(得分:0)

主要问题是你的struct模块上有函数。这将导致像你看到的问题。您需要分离结构和函数。如果需要,可以将struct模块嵌套在模块中。

defmodule P do
  defmodule Data do
     defstruct a: 2, b: 4
  end

  def geta(%Data{a: a}), do: a
  def getb(%Data{b: b}), do: b
end

在iex中:

iex> P.geta(%P.Data{a: 10})
10
iex> P.getb(%P.Data{a: 3, b: 24})
24