2013-12-18 10 views
6

मैं Scala in Depth में DelayedInit पर देख रहा हूँ ...समझौता DelayedInit

टिप्पणियां कोड की मेरी समझ रहे हैं।

निम्नलिखित विशेषता एक एकल तर्क स्वीकार करती है, जिसे गैर-सख्ती से मूल्यांकन किया जाता है (=> के कारण), और Unit देता है। इसका व्यवहार एक निर्माता के समान है।

trait DelayedInit { 
    def delayedInit(x: => Unit): Unit 
} 

जैसा कि मैंने App समझते हैं, इस विशेषता एक var x कि 0-arity (कोई तर्क) के एक समारोह के बराबर होती है है। xdelayedInit विधि पर कॉल के आधार पर असाइन किया जाता है।

फिर, mainapply '_()' पर x पर कॉल करेगा यदि उसके पास Some(Function0[Unit]) प्रकार है। यदि xNone है, तो कुछ भी नहीं होगा।

trait App extends DelayedInit { 
    var x: Option[Function0[Unit]] = None 
    override def delayedInit(cons: => Unit) { 
    x = Some(() => cons) 
    } 
    def main(args: Array[String]): Unit = 
    x.foreach(_()) 
} 

फिर, मैं इस पुस्तक का उदाहरण प्रति REPL के लिए चला गया:

scala> val x = new App { println("Now I'm initialized") } 
x: java.lang.Object with App = [email protected] 

मैंने देखा कि के उत्पादन ...

scala> x.main(Array())

कुछ नहीं था।

एक App उदाहरण के निर्माण के लिए इतना है कि x.main(Array()) रिटर्न निर्माता की तरह व्यवहार delayedInit बुला में परिणाम चाहिए? या, अधिक ठोस रूप से, Now I'm initialized मुद्रित होने की उम्मीद की जानी चाहिए?

+0

जैसा कि मॉरीसिओ ने इंगित किया था, जब मैंने गहराई के 'देरीएडइनिट' में स्कैला शामिल नहीं किया था, 'अब मैं' x.main (Array()) चलाते समय मुद्रित हो गया हूं। नीचे दिए गए उनके विस्तृत उत्तर के अलावा (धन्यवाद), दस्तावेज़ों ने मुझे मदद की - http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.DelayedInit। –

उत्तर

6

मुझे लगता है कि आपने App के समान फ़ाइल पर अपनी DelayedInit विशेषता परिभाषित की है। यदि आपने ऐसा किया है, तो इसे हटाएं, DelayedInitscala पैकेज के अंदर एक विशेषता है।

मुझे अभी पुस्तक से कोड मिला है और सीधे एक ग्रहण वर्कशीट में चिपकाया गया है और यह बस काम करता है।

संपादित

क्या होता है कि delayedInit अंदर कोड सिर्फ गुमनाम अनुप्रयोग वस्तु आप नए एप्लिकेशन {println ("अब मैं प्रारंभ कर रहा हूँ")} के साथ बना रहे हैं पर निर्माता से पहले कहा जाता हो जाता है। आप इसे इस स्क्रीनशॉट में देख सकते हैं:

Worksheet showing the code being executed

आप इस लाइन को हटाने का फैसला करते हैं:

x = Some(() => cons) 

आपको लगता है कि अब मैं प्रारंभ कर रहा हूँ मुद्रित कभी नहीं देखेंगे। चूंकि अज्ञात App ऑब्जेक्ट के लिए कन्स्ट्रक्टर कोड जिसे आप बना रहे हैं delayedInit विधि को दिया गया है लेकिन कहीं भी नहीं चलाया जाता है, इसलिए App का ऑब्जेक्ट कन्स्ट्रक्टर कभी नहीं चलाया जाता है।

+0

'यह सिर्फ काम करता है' का मतलब है कि 'अब मुझे प्रारंभ किया गया है' जब आप 'x.main (Array())' कॉल करते हैं तो मुद्रित हो जाता है? जैसा कि मैं उपरोक्त 'ऐप' वर्ग के तत्कालता को समझता हूं, मुझे ऑब्जेक्ट बनाने के दौरान 'देरी हुई इंट' कॉलिंग नहीं दिखाई देती है। ऑब्जेक्ट बनाते समय, स्कैला में, फ़ंक्शन ('def') स्वचालित रूप से निष्पादित नहीं होते हैं, जैसा कि मैं समझता हूं। –

+0

हां, यह करता है, यहां वर्कशीट का एक स्क्रीनशॉट है - https://www.evernote.com/shard/s26/sh/11c17153-3f69-49a0-90c1-734dc5cd1cfb/ad773eac13a9ccc955e0dcadecfa0238 –

+0

ऑब्जेक्ट इंस्टेंटेशन पर, फिर देरी हुई Init 'x' के मान को अपडेट करने के लिए बुलाया जाता है? जब कोई नया 'ऐप' बनाया जाता है, तो क्या यह लाइन केवल 'var x: विकल्प [फंक्शन 0 [यूनिट]] = कोई नहीं' मूल्यांकन नहीं किया जाता है? –

संबंधित मुद्दे