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

时间:2015-02-10 07:20:03

标签: elixir

我正在向我的Elixir库中添加规范信息,但我注意到当我在另一个IEx会话中重新加载库时,它没有选择我正在添加的'@spec'更改。我的问题是,当我们做的时候

r(Module) 
在IEx中

究竟正在重新加载什么?

1 个答案:

答案 0 :(得分:5)

非常好的问题!

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

由于从.beam文件加载了typespecs和docs(它们没有在模块的内存中加载,因为它们不需要在内存中),因此在重新加载模块时它们不会更新,因为磁盘仍然是一样的。

PS:我主要回答了r / 1函数的工作原理以及你看到这种行为的原因。如果有兴趣,你可以在Erlang中阅读更多关于热代码交换的内容,这也适用于Elixir:http://learnyousomeerlang.com/designing-a-concurrent-application#hot-code-loving