这两个代码块之间的功能差异是什么?

时间:2016-01-12 07:40:10

标签: erlang

首先:

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

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

f() ->
    ok.

第二

fun ?MODULE:f/0

我在热代码升级期间遇到了这种变化。 fun f/0SELECT NON EMPTY { [Measures].[Fact Sample Count] } ON COLUMNS, NON EMPTY { ( [Fact Sample].[Sample Reference No].[Sample Reference No].ALLMEMBERS ) } ON ROWS FROM [LIMSInstCube] WHERE ( [Dim Material Master].[Material Master ID].&[999] ) 之间有什么区别?

2 个答案:

答案 0 :(得分:6)

来自Erlang documentation

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

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

  •   

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

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

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

答案 1 :(得分:1)

?MODULE是一个预定义的宏,它扩展为当前模块名称。在您的情况下,它将扩展为some_mod。将fun f/0称为fun ?MODULE:f/0可确保在f/0的新编译和加载版本可用时,将使用较新版本some_mod