Исключение актеров Scala "Реагируйте на канал, принадлежащий другому актеру"

StackOverflow https://stackoverflow.com/questions/3624254

  •  26-09-2019
  •  | 
  •  

Вопрос

Учитывая следующий код:

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() бросает следующее исключение:

scala.actors.Actor$$anon$1@452bb7e0: 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)

Может кто-нибудь, пожалуйста, просветите меня, почему это так? :)

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top