有很多演员回复发件人回复另一条消息的例子,但在浏览API文档时我发现了!!和!?运营商是CanReply特征的一部分(似乎是2.8的新成员:http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html)。因此,我想知道是否只是让接收/反应块返回一个值,即使PartialFunction返回类型而不是Unit?
我将开始深入挖掘源代码,试图找出它们的用途,但如果有人有任何见解或知道更深入的文档或示例,那么我将非常感激。
干杯, 保罗。
答案 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!