当我们重新加载 Elixir 模块时会发生什么?

What happens when we reload Elixir modules?

我正在将规范信息添加到我的 Elixir 库中,但我注意到当我在另一个 IEx 会话中重新加载该库时,它没有获取我添加的“@spec”更改。我的问题是,当我们

r(Module) 

在 IEx 中,究竟重新加载了什么?

很好的问题!

当我们在 IEx 中重新加载模块时,我们会重新编译模块源代码,将其内容重新加载到内存中。磁盘中的原始 .beam 文件,可能是模块第一个定义的来源,根本没有改变。

由于类型规范和文档是从 .beam 文件加载的(它们没有随模块一起加载到内存中,因为它们不需要在内存中),因此当您重新加载模块时它们不会更新,因为磁盘内容还是一样

PS:我已经回答了 r/1 函数的大部分工作原理以及您为什么会看到这种行为。如果有兴趣,您可以在 Erlang 中阅读更多关于热代码交换的信息,这也适用于 Elixir:http://learnyousomeerlang.com/designing-a-concurrent-application#hot-code-loving