所以例如
f() -> 3.
x() -> F = fun() -> f() end,
A = f(),
B = ?MODULE:f(),
C = F().
在定义F
哈希之后,f()
的新版本代码定义如下
f()-> three
已加载。
C
的价值是什么。
答案 0 :(得分:0)
如果你不能阅读整个答案 的更新强> 上下文:答案是“三”
编辑:抱歉,答案有误导性, 这是正确的答案: 由于刚刚定义了F但是没有评估函数, 因为我们在评估F之前正在进行完全合格的呼叫; 将加载新代码,值将为“三”
所以,我在erlang邮件列表中发布了这个问题,我得到了这个答案的回复
Funs始终绑定到最初加载的代码。只有名称查找受到加载AFAICT的代码的影响。 这是我们之前开发中的异常来源,因为第一次加载新代码时,F仍然有效,但是第二次加载新代码时,旧代码被清除,F现在无效。对它的任何调用都会产生异常。 我们最终将我们对lambdas的需求包含在一个带状态的模块中。不是最优雅,但让我们得到“动态的lambdas”。如果你需要的只是模块:功能,你可以使用元组而不是有趣。 此致 JW
答案 1 :(得分:-1)
在您的示例中,只有B的值为“3”。最新版本的模块仅在对模块进行外部调用时执行。这使得热代码升级为原子操作,您要么执行旧代码,要么执行新代码,而不是两者都执行。