2010-09-02 6 views
7

Учитывая следующий код:Скала актеры исключение "реагирует на канале, принадлежащим к другому актеру"

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") 
     } 
    } 
    } 
} 

Создания экземпляра B 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

Правильно, я думаю, я схожу с ума. Это терпит неудачу с такой же ошибкой: класса С простирается Актер { Защита акт() { тест Val = Actor.actor { reactWithin (1000) { выход }} reactWithin (1000) { выход } }} вал с = новый C() c.start Что я здесь отсутствует? – LeChe

ответ

6

Внутри блока Actor.actor вы должны ссылаться на такие вещи, как реагировать и реагировать, используя переменную «self», например: self.reactWithin (1000). Это должно отличить их от методов, уже унаследованных от родительского класса.

+0

Конечно, мне так глупо. Спасибо за это. Странно, хотя для ответа на это потребовалось две недели ... :) – LeChe

+0

+1 Это действительно странно. Думаю, я бы потратил много времени на отладку, если бы не нашел этот вопрос + ответ. Благодаря :) – fresskoma

 Смежные вопросы

  • Нет связанных вопросов^_^