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
    的最新代码中的arity
    A
    调用函数
    F
    。请注意,创建fun
    fun 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.