我对 Scala 相当陌生。
我试图了解当闭包作为消息的一部分传递给 Actor 时,scala 如何/是否进行动态绑定(bind)。
我正在使用 Akka 1.2 和 Scala 2.9。
我有以下代码段(从 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 使用动态绑定(bind)(有人告诉我),我本来期望
true
false
但不知何故,结果是
false
false
那么scala静态绑定(bind)变量并将18作为两个答案消息的minAge值是真的吗?有没有办法在消息中使用闭包时保持动态绑定(bind)行为?
谢谢!
最佳答案
您对闭包的理解是正确的。然而它正在做动态绑定(bind)您正在引入并发问题 .闭包绑定(bind)到可变数据,这使得闭包可变。只有当您在参与者之间传递严格不可变的数据时,参与者模型才能解决并发问题。您可以按看似按时间顺序编写它,但参与者调度程序会更改事件的顺序。由于 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)
关于与 Actor 一起使用时的 Scala 变量绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441102/