Scala actor如何返回值以响应消息?

时间:2010-05-14 19:33:16

标签: scala scala-2.8 actor

有很多演员回复发件人回复另一条消息的例子,但在浏览API文档时我发现了!!和!?运营商是CanReply特征的一部分(似乎是2.8的新成员:http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html)。因此,我想知道是否只是让接收/反应块返回一个值,即使PartialFunction返回类型而不是Unit?

我将开始深入挖掘源代码,试图找出它们的用途,但如果有人有任何见解或知道更深入的文档或示例,那么我将非常感激。

干杯, 保罗。

1 个答案:

答案 0 :(得分:22)

可以使用方法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!