与Actors一起使用时的Scala变量绑定

时间:2011-12-09 04:33:19

标签: scala closures akka actor

我是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值,这是真的吗?有没有办法在消息中使用闭包时保持动态绑定行为?

谢谢!

1 个答案:

答案 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)