2011-06-09 52 views
6

下面的代码在Scala 2.8中工作正常,但在2.9.0.1中没有工作 (在REPL中复制和粘贴)。这会在2.9.0.1中抛出一个异常。这是一个bug在斯卡拉2.9.0.1演员库

import scala.actors.Actor 
import scala.actors.TIMEOUT 

object A2 extends Actor { 
    def act = { 
    loop { 
     react { 
     case "hello" => 
      val s = sender 
      reactWithin(2000){ 
      case i:Int => s ! "hello" 
      case TIMEOUT => s ! "TIMEOUT" 
      } 
     case _ => 
     } 
    } 
    } 
} 

object A1 extends Actor { 
    def act = { 
    loop { 
     react { 
     case m:String => println (A2 !? (1000, m)) 
     case _ => 
     } 
    } 
    } 
} 

A1.start 
A2.start 

A1 ! "hi" 
A1 ! "hello" 

如果异常不立即抛出,继续做A1 ! "hi"A1 ! "hello"几次。

这是Scala 2.9.0.1中的错误,还是代码有问题?

[编辑]忘了添加引发的实际异常。

scala> [email protected]: caught java.lang.RuntimeException: unhandled timeout 
java.lang.RuntimeException: unhandled timeout 
    at scala.sys.package$.error(package.scala:27) 
    at scala.actors.Actor$class.receiveWithin(Actor.scala:606) 
    at $line4.$read$$iw$$iw$A1$.receiveWithin(<console>:10) 
    at scala.actors.Channel.receiveWithin(Channel.scala:71) 
    at scala.actors.ActorCanReply$class.$bang$qmark(ActorCanReply.scala:32) 
    at $line3.$read$$iw$$iw$A2$.$bang$qmark(<console>:9) 
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:15) 
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:13) 
    at scala.actors.ReactorTask.run(ReactorTask.scala:31) 
    at scala.actors.Reactor$class.resumeReceiver(Reactor.scala:129) 
    at $line4.$read$$iw$$iw$A1$.scala$actors$ReplyReactor$$super$resumeReceiver(<console>:10) 
    at scala.actors.ReplyReactor$class.resumeReceiver(ReplyReactor.scala:68) 
    at $line4.$read$$iw$$iw$A1$.resumeReceiver(<console>:10) 
    at scala.actors.Actor$class.searchMailbox(Actor.scala:500) 
    at $line4.$read$$iw$$iw$A1$.searchMailbox(<console>:10) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(Reactor.scala:117) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) 
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) 
    at scala.actors.ReactorTask.run(ReactorTask.scala:33) 
    at scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:611) 
    at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325) 

EDIT2:独立程序,而不REPL

package scalaapplication5 
import scala.actors.Actor._ 
import scala.actors.Actor 
import scala.actors.TIMEOUT 


object Main { 
    A1.start 
    A2.start 
    def main(args: Array[String]): Unit = { 
    while (true){ 
     A1 ! "hi" 
     A1 ! "hello" 
     Thread.sleep(1000) 
    } 
    } 
} 

object A2 extends Actor { 
    def act = loop { 
    react { 
     case "hello" => 
     val s = sender 
     reactWithin(2000){ 
      case i:Int => s ! "hello" 
      case TIMEOUT => s ! "TIMEOUT" 
     } 
     case _ => 
    } 
    } 
} 

object A1 extends Actor { 
    def act = { 
    loop { 
     react { 
     case m:String => println (A2 !? (1000, m)) 
     case _ => 
     } 
    } 
    } 
} 
+3

“这是Scala 2.9.0.1中的错误,还是代码有问题?” - 我无法提供Scala和世界语之间的差异,但我知道这个问题的答案几乎总是“它是你的代码”:-) – paxdiablo 2011-06-09 04:01:34

+0

你用Scala 2.8试过了吗,看到没有异常抛出,但是扔在2.9.x – Jus12 2011-06-09 04:03:35

+0

适合我的作品(在2.9.0) – IttayD 2011-06-09 04:48:41

回答

3

但这似乎已经在演员框架的错误。看起来你不应该得到一个RuntimeException。 See the Scala Bug Tracker了解详情。它已于2011年7月7日修复,可能正在等待发布。