Erlang 什么';这两段代码在功能上有什么不同?
第一: 第二:Erlang 什么';这两段代码在功能上有什么不同?,erlang,Erlang,第一: 第二: -module(some_mod). -compile(export_all). some_fun() -> fun f/0. f() -> ok. 我在热代码升级期间遇到了此更改。fun?模块:f/0和fun f/0之间的区别是什么??模块是一个预定义的宏,可扩展到当前模块名称。在您的情况下,它将扩展到一些_mod。将fun f/0称为fun?模块:f/0可确保在有新编译和加载版本的某些模块可用时使用更新版本的f/0。来源: 由fun M:F
-module(some_mod).
-compile(export_all).
some_fun() ->
fun f/0.
f() ->
ok.
我在热代码升级期间遇到了此更改。
fun?模块:f/0
和fun f/0
之间的区别是什么??模块
是一个预定义的宏,可扩展到当前模块名称。在您的情况下,它将扩展到一些_mod
。将fun f/0
称为fun?模块:f/0
可确保在有新编译和加载版本的某些模块可用时使用更新版本的f/0
。来源:
- 由
fun M:F/A
创建的乐趣称为外部乐趣。调用它将始终使用模块M
的最新代码中的arityA
调用函数F
。请注意,创建funfun M:F/A
时,甚至不需要加载模块M
- 所有其他的娱乐被称为本地娱乐。调用本地fun时,将调用创建该fun的相同版本的代码(即使已加载较新版本的模块)
正如文档所述,它们在代码升级中有不同的行为。第一个模块使用一个本地函数(fun f/0
),第二个模块使用一个外部函数(fun?模块:f/0
,在预处理中被替换为fun some\u mod:f/0
)
因此,如果您升级了第一个模块(使用本地功能),那么使用某些功能的进程就不会使用较新版本。但是,如果您升级第二个模块(使用外部功能),则只要在加载新版本之前从内部进程调用some\u fun
,就会调用最新版本的代码
注意:一个模块只能有两个版本,旧版和新版。如果加载了第三个版本的模块,代码服务器将删除(清除)旧代码,并终止其中保留的任何进程。事实上,如果加载了第三个版本的模块,则保留旧代码中对fun引用的任何进程(在fun f/0
案例中)也将终止。
-module(some_mod).
-compile(export_all).
some_fun() ->
fun ?MODULE:f/0.
f() ->
ok.