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

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

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

Cheers, Пол.

Ответы

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

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

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!