मैं Scala in Depth में DelayedInit
पर देख रहा हूँ ...समझौता DelayedInit
टिप्पणियां कोड की मेरी समझ रहे हैं।
निम्नलिखित विशेषता एक एकल तर्क स्वीकार करती है, जिसे गैर-सख्ती से मूल्यांकन किया जाता है (=>
के कारण), और Unit
देता है। इसका व्यवहार एक निर्माता के समान है।
trait DelayedInit {
def delayedInit(x: => Unit): Unit
}
जैसा कि मैंने App
समझते हैं, इस विशेषता एक var x
कि 0-arity (कोई तर्क) के एक समारोह के बराबर होती है है। x
delayedInit
विधि पर कॉल के आधार पर असाइन किया जाता है।
फिर, main
apply '_()'
पर x
पर कॉल करेगा यदि उसके पास Some(Function0[Unit])
प्रकार है। यदि x
None
है, तो कुछ भी नहीं होगा।
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
मुद्रित होने की उम्मीद की जानी चाहिए?
जैसा कि मॉरीसिओ ने इंगित किया था, जब मैंने गहराई के 'देरीएडइनिट' में स्कैला शामिल नहीं किया था, 'अब मैं' x.main (Array()) चलाते समय मुद्रित हो गया हूं। नीचे दिए गए उनके विस्तृत उत्तर के अलावा (धन्यवाद), दस्तावेज़ों ने मुझे मदद की - http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.DelayedInit। –