Привязка переменных Scala при использовании с актерами - PullRequest
5 голосов
/ 09 декабря 2011

Я довольно новичок в Скале. Я пытаюсь понять, как / если scala выполняет динамическое связывание, когда замыкание передается как часть сообщения актеру.

Я использую 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)

На стороне актера он просто применяет isAdult к первому параметру и печатает результат. Поскольку Scala использует динамическое связывание (как мне сказали), я ожидал

true
false

но как-то получается

false
false

Так верно ли, что scala статически связывает переменную и принимает 18 в качестве значения minAge для обоих ответных сообщений? Есть ли способ сохранить динамическое связывание при использовании замыканий в сообщениях?

Спасибо!

1 Ответ

9 голосов
/ 09 декабря 2011

Ваше понимание замыканий верно. Это делает динамическое связывание, однако вы вводите проблемы параллелизма . Закрытие является привязкой к изменяемым данным, что делает закрытие изменяемым. Модель актора решает проблемы параллелизма только тогда, когда вы передаете строго неизменяемые данные между актерами. Вы можете написать это в на первый взгляд хронологическом порядке, но планировщик акторов меняет порядок событий. И поскольку 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)
...