2010-09-02 55 views
7

鑑於以下代碼:Scala的演員異常 「上通道反應屬於其他演員」

class A extends Actor { 
    def act() { 
    loop { 
     reactWithin(1000) { 
     case _ => println("A Message") 
     } 
    } 
    } 
} 

class B extends A { 
    val test = Actor.actor { 
    loop { 
     reactWithin(1000) { 
     case "B" => println("B Message") 
     } 
    } 
    } 
} 

創建乙val t = new B()的實例引發以下例外:

[email protected]: caught java.lang.AssertionError: assertion failed: react on channel belonging to other actor 
java.lang.AssertionError: assertion failed: react on channel belonging to other actor 
at scala.actors.ReplyReactor$class.reactWithin(ReplyReactor.scala:123) 
at A.scala$actors$Actor$$super$reactWithin(Tester.scala:11) 
at scala.actors.Actor$class.reactWithin(Actor.scala:613) 
at A.reactWithin(Tester.scala:11) 
at B$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(Tester.scala:24) 
at B$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(Tester.scala:24) 
at scala.actors.Reactor$class.seq(Reactor.scala:280) 
at A.seq(Tester.scala:11) 
at scala.actors.Reactor$$anon$3.andThen(Reactor.scala:258) 
at scala.actors.Combinators$class.loop(Combinators.scala:26) 
at A.loop(Tester.scala:11) 
at B$$anonfun$1.apply$mcV$sp(Tester.scala:23) 
at scala.actors.Actor$$anon$1.act(Actor.scala:135) 
at scala.actors.Reactor$$anonfun$dostart$1.apply(Reactor.scala:222) 
at scala.actors.Reactor$$anonfun$dostart$1.apply(Reactor.scala:222) 
at scala.actors.ReactorTask.run(ReactorTask.scala:36) 
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) 

有人請賜教,我爲什麼這樣? :)

+0

對,我想我瘋了。這個失敗,同樣的錯誤: C類延伸演員{ DEF行爲(){ VAL測試= Actor.actor { reactWithin(1000){ 出口 } } reactWithin(1000){ 出口 } } } val c = new C() c.start 我在這裏丟失了什麼? – LeChe 2010-09-04 19:51:07

回答

6

在Actor.actor塊內部,您必須使用'self'變量引用諸如react和reactWithin之類的內容,如下所示:self.reactWithin(1000)。這是爲了將它們與已經從父類繼承的方法區分開來。

+0

當然,我很愚蠢。謝謝你。奇怪,雖然花了兩週的時間纔有人回答這個問題...... :) – LeChe 2010-09-28 08:11:00

+0

+1這真的很奇怪。我想我會花很多時間調試這個,如果我沒有找到這個問題+答案。謝謝 :) – fresskoma 2011-06-14 22:02:12