2010-09-02 9 views
7

der folgende Code Gegeben:Scala Akteure Ausnahme "reagiert auf Kanal zu anderem Akteure gehör"

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

und

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

eine Instanz von B Erstellen val t = new B() führen die folgende Ausnahme:

[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) 

Könnte jemand bitte mich erleuchten, warum das ist? :)

+0

Richtig, ich glaube ich werde verrückt. Dies scheitert mit dem gleichen Fehler: Klasse C Schauspieler { def act() { val test = Actor.actor { reactWithin (1000) { Ausfahrt } } reactWithin (1000) { Ausfahrt erstreckt} } } val c = new C() c.start Was bin ich hier? – LeChe

Antwort

6

Im Actor.actor-Block müssen Sie sich auf Dinge wie react und reactWithin beziehen, indem Sie die 'self'-Variable verwenden, so: self.reactWithin (1000). Dies dient dazu, sie von den Methoden zu unterscheiden, die bereits von der Elternklasse übernommen wurden.

+0

Natürlich bin ich so dumm. Danke dafür. Seltsam, dass es zwei Wochen dauerte, bis jemand darauf antwortete ... :) – LeChe

+0

+1 Das ist wirklich komisch. Ich denke, ich hätte viel Zeit mit dem Debuggen verbracht, wenn ich diese Frage + Antwort nicht gefunden hätte. Vielen Dank :) – fresskoma