2010-09-02 9 views
7

Dado el siguiente código:Scala actores excepción "reacciona en el canal perteneciente a otro actor"

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

y

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

Creación de una instancia de B val t = new B() tiros la siguiente excepción:

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

¿Podría alguien por favor aclararme por qué es así? :)

+0

Bien, creo que me estoy volviendo loco. Esta falla con el mismo error: clase C se extiende Actor { def acto() { prueba val = Actor.actor { reactWithin (1000) { salida } } reactWithin (1000) { salida } }} val c = new C() c.start Qué me estoy perdiendo aquí? – LeChe

Respuesta

6

Dentro del bloque Actor.actor, debe hacer referencia a cosas como reaccionar y reaccionar con la variable 'self', como lo hace: self.reactWithin (1000). Esto es para distinguirlos de los métodos ya heredados de la clase padre.

+0

Por supuesto, soy tan estúpido. Gracias por esto. Aunque es extraño que le tomó dos semanas a alguien responder esto ... :) – LeChe

+0

+1 Esto es realmente extraño. Supongo que habría pasado mucho tiempo depurando esto si no hubiera encontrado esta pregunta + respuesta. Gracias :) – fresskoma

Cuestiones relacionadas