在scala中定义时自引用val
发布时间:2020-12-16 18:34:24 所属栏目:安全 来源:网络整理
导读:这是我在 scala中发现的东西,它有效,我无法弄清楚为什么,任何人都可以解释为什么这有效吗? 基本上我可以使用val的引用,而我仍在定义它(因为我的其他对象/ actor将其作为参数接受) val backbone: ActorRef = context.actorOf( F_BackBone.props( context.act
这是我在
scala中发现的东西,它有效,我无法弄清楚为什么,任何人都可以解释为什么这有效吗?
基本上我可以使用val的引用,而我仍在定义它(因为我的其他对象/ actor将其作为参数接受) val backbone: ActorRef = context.actorOf( F_BackBone.props( context.actorOf(F_PictureHandler.props(backbone)),context.actorOf(F_UserHandler.props(backbone)),context.actorOf(F_PageProfileHandler.props(backbone)) ) ) 如果我没有明确定义类型,我将得到编译器错误,这是有道理的. 解决方法
请注意,在这种特定情况下,虽然代码编译,但它不会正常运行,因为正如在另一个答案的注释中所建议的那样,传递给其他actor的主干的值是’null’.
此示例演示了这一点: import akka.actor.{Props,Actor,ActorRef,ActorSystem} class SenderReceiver(sendTo:ActorRef) extends Actor{ override def preStart(): Unit = { self ! "Start" } def receive = { case "Start" => sendTo ! "Hello" case "Hello" => println("Received Hello") } } object SenderReceiver { def props(sendTo:ActorRef):Props = Props(new SenderReceiver(sendTo)) } object Example extends App { val system = ActorSystem() val actor: ActorRef = system.actorOf(SenderReceiver.props(actor)) system.awaitTermination() } 这产生以下(反复,因为管理程序策略尝试重新启动actor): [info] [ERROR] [12/01/2015 09:47:04.543] [default-akka.actor.default-dispatcher-9] [akka://default/user/$a] null [info] java.lang.NullPointerException [info] at SenderReceiver$$anonfun$receive$1.applyOrElse(example.scala:10) [info] at akka.actor.Actor$class.aroundReceive(Actor.scala:467) [info] at SenderReceiver.aroundReceive(example.scala:3) [info] at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) [info] at akka.actor.ActorCell.invoke(ActorCell.scala:487) [info] at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) [info] at akka.dispatch.Mailbox.run(Mailbox.scala:220) [info] at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [info] at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [info] at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [info] at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [info] at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |