这是对Scala variable binding when used with Actors
早期问题的跟进反对其他人的建议,我决定制作一个包含闭包的消息,并改变消息之间关闭闭包的变量..并明确地等待它们。 环境是scala 2.9上的akka 1.2
考虑以下
var minAge = 18
val isAdult = (age: Int) => age >= minAge
println((actor ? answer(19, isAdult)).get)
minAge = 20
println((actor ? answer(19, isAdult)).get)
回答的消息处理程序基本上将isAdult应用于第一个参数(19)。 当演员是本地人时,我得到了我期望的答案。
true
false
但是当它很遥远时,我得到了
false
false
我只是好奇为什么这会是这种行为?我原本预计两者之间会有一致的行为。
提前致谢!
答案 0 :(得分:2)
嗯,您已经遇到过可能(或可能不)被认为是系统的问题,其中行为由未由该语言强制执行的规则指定。 Java中也发生过同样的事情。这里:
Data d = rmiServer.getSomeData();
d.mutate()
您是否预计服务器上也会发生突变?涉及远程通信的任何系统的一个基本问题,特别是当该通信对客户端透明时,是了解通信发生的位置以及正在发生的事情。
答案 1 :(得分:1)
你在这里遇到的是我称之为Scala闭包的“贪婪”:他们从不关闭“按价值”,大概是因为统一访问原则。这意味着闭包包含$outer
引用,用于获取minAge
的值。你没有提供足够的上下文来展示你的测试中$outer
的样子,因此我无法更准确地说明它是如何序列化的,从中可以看出为什么它会打印出你所展示的内容。
但是,有一个词:请不要像这样发送闭包。当你承认自己时,这不是幸福的秘诀。