如何让演员将消息发送回呼叫者?

时间:2011-06-23 16:36:16

标签: scala actor self

我正在尝试重现这个example。 一切都在编译,但是当我运行它时,我的所有结果都是这样的:

  scala> NameResolver ! ("www.scala-lang.org", self)

  scala> self.receiveWithin(0) { case x => x }
  res0: Any = TIMEOUT // and not Some(www.scala-lang.org/128.178.154.102)

  scala> NameResolver ! ("wwwwww.scala-lang.org", self)

  scala> self.receiveWithin(0) { case x => x }
  res1: Any = TIMEOUT // and not None

以下是我的例子:

import scala.actors._
import scala.actors.Actor._

case class Plus(x: Int, y: Int)

val concurrentCalculator = actor {
   while(true)
      receive {
         case Plus(x, y) => println(x + y)
         case (Plus(x, y), caller: Actor) => caller ! (x + y)
      }
}

scala> concurrentCalculator ! Plus(2,3)
5

scala> concurrentCalculator ! (Plus(2,3), self)

scala> self.receiveWithin(1000) { case x => x }
res0: Any = TIMEOUT // WTF?

那我为什么得到一个TIMEOUT而不是一个有效的结果?

2 个答案:

答案 0 :(得分:4)

由于Scala REPL的工作方式(每个要评估的表达式都编译成一个单独的类),您可以检查self是否在不在代码块内的不同调用上返回不同的值:

scala> self
res3: scala.actors.Actor = scala.actors.ActorProxy@1bb0ff0

scala> self
res4: scala.actors.Actor = scala.actors.ActorProxy@46530

在一个代码块中,即使未明确声明为actor,它也能正常工作:

scala> {
     | concurrentCalculator ! (Plus(2,3), self)
     | self.receiveWithin(1000) { case x => x }
     | }
res9: Any = 5

答案 1 :(得分:0)

这里的问题是调用代码不是actor,因此concurrentCalculator actor中的第二种情况不匹配。

相反,试试这个,你应该看到你的期望:

val me = actor { 
  concurrentCalculator ! (Plus(2,3), self); 
  self.receiveWithin(1000) { case x => println(x) } 
}