我是Scala的新手。 我试图理解当一个闭包作为消息的一部分传递给Actor时scala是否进行动态绑定。
我正在使用带有Scala 2.9的Akka 1.2。
我有以下代码段(从http://gleichmann.wordpress.com/2010/11/15/functional-scala-closures/修改)
var minAge = 18
val isAdult = (age: Int) => age >= minAge
actor ! answer(19, isAdult)
minAge = 20
actor ! answer(19, isAdult)
在actor方面,它只是将isAdult应用于第一个参数并打印结果。 由于Scala使用动态绑定(所以我被告知),我本来希望
true
false
但不知何故,结果是
false
false
因此,scala是静态绑定变量并将18作为两个答案消息的minAge值,这是真的吗?有没有办法在消息中使用闭包时保持动态绑定行为?
谢谢!
答案 0 :(得分:9)
您对封闭的理解是正确的。它正在进行动态绑定,但引入并发问题。闭包绑定到可变数据,这使得闭包可变。当您在actor之间传递严格不可变数据时,actor模型仅解决并发问题。您可以按看似按时间顺序编写它,但演员调度程序会更改事件的顺序。由于isAdult是可变的,重新排序会改变结果。
actor ! answer(19, isAdult) // message put in actor queue
minAge = 20
actor ! answer(19, isAdult) // message put in actor queue
// later...
// actor handles answer(19, isAdult)
// actor handles answer(19, isAdult)