Erlang中的变量是(或可以被称为)引用变量吗?
问题描述:
f() -> 3.
x() -> F = fun() -> f() end,
A = f(),
B = ?MODULE:f(),
C = F().
被定义F
散列之后,代码为f()
一个新版本被定义如下 f()-> three
和加载。 C
的值是多少?
答
在你的例子中,只有B的值是'三'。只有在对模块进行外部调用时才会执行最新版本的模块。这使得热代码升级成为原子操作,你要么执行旧代码,要么执行新代码,而不是两者都执行。
答
如果你不能看完整答案 更新 方面:答案是“三化”
编辑:对不起答案是误导性的, 这里是正确的答案: 由于F是刚刚但是该功能未被评估,因为我们在评估F之前进行了完全合格的调用; 新的代码将被加载和值将是“三化”
所以,我张贴在二郎邮件列表的问题,我得到这个答案的答复
玩意儿总是绑定到的代码,他们最初是从中加载的。只有名称查找受代码加载AFAICT的影响。 在我们以前的开发中,这是一个例外来源,因为第一次加载新代码时,F仍然有效,但是第二次加载新代码时,旧代码已被清除,F现在无效。任何对它的调用都会产生一个异常。 我们最终将我们对lambdas的需求包装在状态模块中。不是最优雅的,但允许我们获得“动态lambda”。如果你所需要的只是module:function,你可以使用一个元组来代替fun。 此致 jw
那么你的结论是什么?那里(新的)代码会在B(我得到这个)之后加载,但是C的值呢? – Gokul 2012-01-16 14:37:04