我正在尝试重现这个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
而不是一个有效的结果?
答案 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) }
}