Erlang中的变量是(或可以被称为)引用变量吗?

问题描述:

所以例如Erlang中的变量是(或可以被称为)引用变量吗?

f() -> 3. 
x() -> F = fun() -> f() end, 
     A = f(), 
     B = ?MODULE:f(), 
     C = F(). 

被定义F散列之后,代码为f()一个新版本被定义如下 f()-> three和加载。 C的值是多少?

在你的例子中,只有B的值是'三'。只有在对模块进行外部调用时才会执行最新版本的模块。这使得热代码升级成为原子操作,你要么执行旧代码,要么执行新代码,而不是两者都执行。

+0

那么你的结论是什么?那里(新的)代码会在B(我得到这个)之后加载,但是C的值呢? – Gokul 2012-01-16 14:37:04

如果你不能看完整答案 更新 方面:答案是“三化”

编辑:对不起答案是误导性的, 这里是正确的答案: 由于F是刚刚但是该功能未被评估,因为我们在评估F之前进行了完全合格的调用; 新的代码将被加载和值将是“三化”

所以,我张贴在二郎邮件列表的问题,我得到这个答案的答复

玩意儿总是绑定到的代码,他们最初是从中加载的。只有名称查找受代码加载AFAICT的影响。 在我们以前的开发中,这是一个例外来源,因为第一次加载新代码时,F仍然有效,但是第二次加载新代码时,旧代码已被清除,F现在无效。任何对它的调用都会产生一个异常。 我们最终将我们对lambdas的需求包装在状态模块中。不是最优雅的,但允许我们获得“动态lambda”。如果你所需要的只是module:function,你可以使用一个元组来代替fun。 此致 jw