gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:39:12 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com