14

有很多演员用另一条消息回复发件人的例子,但是在浏览 API 文档时我注意到了 !! 和 !?作为 CanReply 特征的一部分的运算符(这似乎是 2.8 的新内容:http ://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html )。因此,我想知道这是否只是让接收/反应块返回一个值的情况,即使 PartialFunction 返回类型不是单位?

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

干杯,保罗。

4

1 回答 1

22

可以使用 method 发送回复reply,如下所示:

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

可以通过三种方式明确接受回复。

  • 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

如果你运行它,你会得到

iH
elloH
Too slow!
于 2010-05-14T20:06:56.230 回答