与 Actor 一起使用时的 Scala 变量绑定(bind)

标签 scala closures akka actor

我对 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/

相关文章:

scala - 在 akka 中测试定时器事件

scala - Scala中的嵌套迭代

Javascript 函数内变量的提升

java - 有没有办法让 akka actor 暂停 X 次

functional-programming - 关于闭包中词法绑定(bind)的更多解释?

javascript - 将地理编码器结果保存到数组 - 关闭问题

java - 在池中的 Akka actor 实例之间共享可变数据

scala - akka中从ActorRef获取数据

scala - 选项GenTraversableOnce吗?

scala - 单 token 前瞻的性能损失是多少?