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

pdb*_*ett 14 scala scala-2.8 actor

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

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

干杯,保罗.

Rex*_*err 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()
  }}}
}
Run Code Online (Sandbox Code Playgroud)

有三种方法可以明确接受回复.

  • Use !!,返回a 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
Run Code Online (Sandbox Code Playgroud)

如果你运行这个你得到

iH
elloH
Too slow!
Run Code Online (Sandbox Code Playgroud)