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