我正在向我的Elixir库中添加规范信息,但我注意到当我在另一个IEx会话中重新加载库时,它没有选择我正在添加的'@spec'更改。我的问题是,当我们做的时候
r(Module)
在IEx中究竟正在重新加载什么?
答案 0 :(得分:5)
非常好的问题!
当我们在IEx中重新加载模块时,我们重新编译模块源代码,将其内容重新加载到内存中。磁盘中的原始.beam文件,可能是模块的第一个定义来自的文件,根本不会改变。
由于从.beam文件加载了typespecs和docs(它们没有在模块的内存中加载,因为它们不需要在内存中),因此在重新加载模块时它们不会更新,因为磁盘仍然是一样的。
PS:我主要回答了r / 1函数的工作原理以及你看到这种行为的原因。如果有兴趣,你可以在Erlang中阅读更多关于热代码交换的内容,这也适用于Elixir:http://learnyousomeerlang.com/designing-a-concurrent-application#hot-code-loving