【问题标题】:Scala actors exception "react on channel belonging to other actor"Scala演员异常“对属于其他演员的频道做出反应”
【发布时间】:2011-04-07 03:48:23
【问题描述】:

给定以下代码:

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)

有人能告诉我这是为什么吗? :)

【问题讨论】:

  • 对,我想我要疯了。这失败并出现相同的错误:class C extends Actor { def act() { val test = Actor.actor { reactWithin(1000) { exit } } reactWithin(1000) { exit } } } val c = new C() c。 start 我在这里错过了什么?

标签: scala actor channel


【解决方案1】:

在 Actor.actor 块中,您必须使用“self”变量引用诸如 react 和 reactWithin 之类的内容,例如:self.reactWithin(1000)。这是为了将它们与已经从父类继承的方法区分开来。

【讨论】:

  • 当然,我太笨了。谢谢你。奇怪的是,有人花了两个星期才回答这个问题……:)
  • +1 这真的很奇怪。如果我没有找到这个问题+答案,我想我会花很多时间调试这个。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 2019-04-23
  • 2011-01-20
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多