Получение правильной ссылки на отправителя актера scala при отправке из другого класса - PullRequest
0 голосов
/ 03 декабря 2009

В моем актере я должен создать класс, который отправит сообщение другому актеру. Другой актер должен ответить обратно актеру A

class A extends Actor {

val b = new B
b.start

val i = new DefaultHandler() {
            override def fun(a: String) = {  
                b ! payload
            }
        }
someotherclass.registerHandler(i)

def act = {
      loop {
        react {
          case reply => //do something

}

class B extends Actor {

def act = {
      loop {
        react {
          case msg => sender ! reply

          }
}

Проблема теперь в том, что при отправке из внутреннего класса я больше не в самом акторе, и в результате актер B не получает правильную ссылку на актера B. Один из способов исправить это - передать ссылку через сообщение, но мне это кажется довольно уродливым.

val ref = self
val i = new DefaultClass() {
            override def fun(a: String) = {  
                b ! message(payload, ref)
            }
        }

Есть ли более элегантный способ решить эту проблему?

1 Ответ

1 голос
/ 03 декабря 2009

Актер Б получает правильную ссылку, а не А. Однако вы уже ответили на свой вопрос.

Другой подход будет включать:

  1. Расширение от актера
  2. Необязательно: имейте неявное преобразование в ваш тип актера
  3. Имейте неявную ссылку на актера в вашем операторе сообщения

В этом случае ваш DefaultHandler должен будет также сохранить ссылку на ваш оригинальный актер.

...