2015-11-29 5 views
5

में परिभाषा के दौरान एक वैल का संदर्भ देना स्वयं यह कुछ है जो मुझे स्केल में मिला और यह काम करता है और मैं यह नहीं समझ सकता कि क्यों कोई यह बता सकता है कि यह क्यों काम करता है?स्केल

अनिवार्य रूप से मैं जब मैं अभी भी इसे परिभाषित करने हूँ एक वैल के संदर्भ में उपयोग कर सकते हैं (क्योंकि मेरे अन्य वस्तुओं/अभिनेताओं यह एक पैरामीटर के रूप में लेने के लिए)

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 का मूल्य 'शून्य' है।

[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

के निर्माण से पहले पारित एक संदर्भ, फिर भी, मैं कहूंगा कि आर्केग द्वारा अन्य धागे में बनाई गई टिप्पणी लागू होती है: "[...] चर 'ए' तब बनाया जाता है जब आप' val a: int', [.. टाइप करते हैं। ।] "। आपके पास उपयोगकर्ता द्वारा परिभाषित प्रकार है और इंट नहीं है, इसलिए 'रीढ़ की हड्डी' को दाएं हाथ की ओर 'शून्य' में शुरू किया जाएगा –

+0

@ क्रिस्टियन हिर्श मुझे एक ही समझ है। जिसका अर्थ है, 'context.actorOf (F_UserHandler.props (रीढ़ की हड्डी))' 'रीढ़ की हड्डी 'को' शून्य 'के रूप में प्राप्त होगा, जब तक कि इसका आलसी मूल्यांकन न हो (कॉल-बाय-नाम, आलसी वैल इत्यादि)। शायद 'नल' के माध्यम से यहां एक संभावित बग पेश किया जा रहा है। – tuxdna