gpt4 book ai didi

erlang - 这两个代码块在功能上有什么区别?

转载 作者:行者123 更新时间:2023-12-04 23:41:57 28 4
gpt4 key购买 nike

第一的:

-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 ?

最佳答案

来自 Erlang documentation :

  • A fun created by fun M:F/A is called an external fun. Calling it will always call the function F with arity A in the latest code for module M. Notice that module M does not even need to be loaded when the fun fun M:F/A is created.

  • All other funs are called local fun. When a local fun is called, the same version of the code that created the fun is called (even if a newer version of the module has been loaded).


正如文档所述,它们在代码升级方面具有不同的行为。您的第一个模块使用本地函数( fun f/0 ),第二个模块使用外部函数( fun ?MODULE:f/0 在预处理中替换为 fun some_mod:f/0 )。
所以如果你升级你的第一个模块(它使用本地函数),正在使用的进程 some_fun功能,不要使用较新的版本。但是如果你升级第二个模块(它使用外部函数),最新版本的代码将在任何时候被调用 some_fun甚至在加载新版本之前就从内部进程调用。

通知:一个模块只能有两个版本, .如果加载了该模块的第三个版本,则代码服务器会删除(清除)旧代码,并且任何在其中逗留的进程都将终止。

关于erlang - 这两个代码块在功能上有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34737973/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com