2015-11-29 12 views
5

これはスカラーで見つかったもので、なぜ機能するのかわかりません。私はまだそれを定義していながら、(私の他のオブジェクト/俳優は、パラメータとしてそれを取るため)スケーラの定義中にvalを参照している自己

基本的に私は、「私はドン場合、私は、コンパイラエラーになりますヴァルに

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

を参照を使用することができます明示的に型を定​​義することは意味があります。

答えて

1

注意他の回答のコメントで示唆されているように、他のアクターに渡されたbackboneの値は「null」です。

この例では、このことを示しています。

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

関数型プログラミング言語では、再帰的定義は重要な概念です。階乗を定義する古典的な例を考えてみましょう。スカラ座の特定の場合については

は、非常に素晴らしい説明が今月初めに記事で与えられた:コードのコンパイルが、この特定の場合には、それのように、以来、正しく動作しないこと A variable used in its own definition?

+1

しかし、これは再帰的な定義ではありません、それはです:

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

これは(スーパーバイザ戦略は俳優を再起動しようとするので、何度)以下が得られそれが構築される前に参照が渡されている –

+1

しかし、私はArchegによって他のスレッドで行われたコメントが適用されると言っています: "[...]変数' a'は 'val a:Int'、[.. .. 。] "あなたはユーザー定義型でInt型ではないので、 'backbone'は右側で' null'に初期化されます。 –

+0

@ChristianHirsch私は同じ理解を持っています。つまり、 'context.actorOf(F_UserHandler.props(backbone))'は、遅れて評価されている(call-by-name、lazy valなど)場合を除き、 'backbone'を' null'として受け取ります。おそらく、潜在的なバグが 'null 'を介してここに導入されている可能性があります。 – tuxdna