Непоследовательное поведение между локальным и удаленным субъектом - PullRequest
3 голосов
/ 12 декабря 2011

Это своего рода продолжение предыдущего вопроса на Привязка переменной Scala при использовании с актерами

Вопреки советам других, я решил создать сообщение, содержащее замыкание, и преобразовать переменную, в которой замыкание закрывается между сообщениями ... и явно ждать их. Среда акка 1.2 на скала 2.9

Рассмотрим следующее

var minAge = 18
val isAdult = (age: Int) => age >= minAge

println((actor ? answer(19, isAdult)).get) 
minAge = 20
println((actor ? answer(19, isAdult)).get) 

Обработчик сообщений для ответа по существу применяет isAdult к первому параметру (19). Когда актер местный, я получаю ответы, которые ожидаю.

true
false

Но когда он удаленный, я получаю

false
false

Мне просто любопытно, почему это было бы поведение? Я бы ожидал последовательного поведения между двумя ..

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Ну, вы столкнулись с тем, что может (или не может) считаться проблемой для системы, где поведение определяется правилами, которые не применяются языком.То же самое происходит в Java.Здесь:

  1. Клиент: Data d = rmiServer.getSomeData();
  2. Клиент: d.mutate()

Ожидаете ли вы, что мутация произойдет и на сервере?Фундаментальная проблема любой системы, которая включает в себя удаленную связь, особенно когда эта связь прозрачна для клиента, заключается в понимании того, где происходит эта связь и что именно происходит.

  • Связь сактер принимает форму передачи сообщений
  • Эффект может проходить границу только посредством механизма передачи сообщений (то есть эффект должен находиться в возвращаемом значении)
  • Библиотека акторовможет прозрачно обрабатывать передачу сообщения удаленно
  • Если ваш эффект не является сообщением, это не происходит!
1 голос
/ 12 декабря 2011

То, с чем вы сталкиваетесь здесь, - это то, что я бы назвал «жадностью» замыканий Scala: они никогда не закрываются «по стоимости», предположительно из-за принципа единого доступа.Это означает, что замыкание содержит ссылку $outer, которую он использует для получения значения minAge.Вы не дали достаточно контекста, чтобы показать, как $outer выглядит в вашем тесте, поэтому я не могу быть более точным в том, как он сериализуется, из чего следует, почему он печатает то, что вы показываете.

Одно слово, однако: не отправляйте замыкания вокруг этого, пожалуйста.Это не рецепт счастья, как вы признаете себя.

...