Как агенты Scala могут возвратить значение в ответ на сообщение?

Существует много примеров агентов, отвечающих с другим сообщением назад к отправителю, но при просмотре документов API я заметил!! и!? операторы, которые являются частью черты CanReply (который, кажется, в новинку для 2,8: http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html). Я поэтому задавался вопросом, было ли это просто случаем наличия получать/реагировать блока, возвращают значение, т.е. заставляют возврат PartialFunction ввести что-то другое, чем Единица?

Я начну рыть через источник, чтобы попытаться разработать, как они предназначены, чтобы использоваться, но если бы кто-либо имеет понимание или знает о еще всесторонней документации или примерах затем, я был бы крайне признательным.

С наилучшими пожеланиями, Paul.

14
задан pdbartlett 14 May 2010 в 19:33
поделиться

1 ответ

Ответы можно отправлять с помощью метода reply , как показано здесь:

import scala.actors._
class Reverser extends Actor {
  def act() { Actor.loop { react {
    case s: String => Thread.sleep(1000); reply(s.reverse)
    case _ => exit()
  }}}
}

Есть три способа явно принять ответ.

  • Используйте !! , который возвращает Future , который является контейнерным классом, обещающим предоставить вам содержимое, когда оно вам понадобится. Он возвращается немедленно, но если вы действительно запрашиваете содержимое, вам нужно подождать, пока другой поток не завершит работу и не заполнит запрос.
  • Используйте !? без тайм-аута. Ваш код будет приостановлен до тех пор, пока другой поток не ответит.
  • Используйте !? с тайм-аутом. Ваш код будет приостановлен до тех пор, пока не получит ответ или пока не истечет время ожидания, в зависимости от того, что наступит раньше.

Вот пример всех трех:

val r = new Reverser
r.start
val a = (r !! "Hi")
a() match {
  case s: String => println(s)
  case _ => println("Error A")
}
val b = r !? "Hello"
b match {
  case s: String => println(s)
  case _ => println("Error B")
}
val c = (r !? (500,"Howdy"))
c match {
  case Some(s: String) => println(s)
  case Some(_) => println("Error C")
  case None => println("Too slow!")
}
r ! None  // None isn't a string, so r will stop running

И если вы запустите это, вы получите

iH
elloH
Too slow!
22
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: