iex,如何有效地重新加载结构?
iex, how to reload structs effectively?
我找到了一个最小的示例,它显示了我在学习 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 缓存。
两个问题:
- 这是错误还是设计决定?
- 有没有更聪明的方法来解决这个问题?
主要问题是您的结构模块上有函数。那会导致像你看到的问题。您需要将结构和功能分开。如果需要,您可以将结构模块嵌套在模块中。
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
我找到了一个最小的示例,它显示了我在学习 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 缓存。
两个问题:
- 这是错误还是设计决定?
- 有没有更聪明的方法来解决这个问题?
主要问题是您的结构模块上有函数。那会导致像你看到的问题。您需要将结构和功能分开。如果需要,您可以将结构模块嵌套在模块中。
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