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