当前位置:  开发笔记 > 编程语言 > 正文

这两个代码块之间的功能有什么不同?

如何解决《这两个代码块之间的功能有什么不同?》经验,为你挑选了1个好方法。

第一:

-module(some_mod).
-compile(export_all).

some_fun() ->
    fun f/0.

f() ->
    ok.

第二:

-module(some_mod).
-compile(export_all).

some_fun() ->
    fun ?MODULE:f/0.

f() ->
    ok.

我在热代码升级期间遇到了这种变化.fun ?MODULE:f/0和之间有什么区别fun f/0



1> Hamidreza So..:

来自Erlang文档:

创造的乐趣fun M:F/A被称为外部乐趣.调用它将始终在最新的模块代码中F使用arity 调用该函数.请注意,创建乐趣时甚至不需要加载模块.AMMfun M:F/A

所有其他的乐趣被称为本地乐趣.当调用本地乐趣时,将调用创建乐趣的相同版本的代码(即使已加载模块的较新版本).

正如文档所述,它们在代码升级方面有不同的行为.您的第一个模块使用本地函数(fun f/0),第二个模块使用外部函数(fun ?MODULE:f/0在预处理中替换为fun some_mod:f/0).

因此,如果升级第一个模块(使用本地功能),使用some_fun函数的进程不使用较新版本.但是,如果升级第二个模块(使用外部函数),则只要some_fun从加载新版本之前生成的内部进程调用,就会调用最新版本的代码.


注意:模块只有两个版本,旧的新的.如果加载了模块的第三个版本,代码服务器将删除(清除)旧代码,并终止其中的任何进程.


实际上,如果加载了模块的第三个版本,那么任何继续引用旧代码中的乐趣的过程(在`fun f/0`情况下)也会终止.
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有