यह वास्तव में आपके प्रश्न का उत्तर नहीं है, और जब लोग ऐसा करते हैं तो मुझे नफरत है, लेकिन मैं वैसे भी ऐसा करने जा रहा हूं। मुझे लगता है कि सबसे अच्छी प्रतिक्रिया यह है कि: आलसी वैल इसके लिए उपयुक्त नहीं है, इसलिए एक प्रकार को परिभाषित करें जो आपको आवश्यकतानुसार समर्थन देता है।
आप optionalSubsystem()
बजाय optionalSubsystem
के रूप में चर का उल्लेख करना होगा, लेकिन यह, एक अच्छी बात है, क्योंकि डिजाइन आप चाहते हैं के साथ कि संदर्भ प्राप्त करने के एक observably पक्ष प्रभावशाली प्रक्रिया है।
class Lazy[A](f: => A, private var option: Option[A] = None) {
def apply(): A = option match {
case Some(a) => a
case None => val a = f; option = Some(a); a
}
def toOption: Option[A] = option
}
scala> val optionalSubsystem = new Lazy { "a" }
optionalSubsystem: Lazy[java.lang.String] = [email protected]
scala> optionalSubsystem.toOption.isDefined
res1: Boolean = false
scala> optionalSubsystem()
res2: java.lang.String = a
scala> optionalSubsystem.toOption.isDefined
res12: Boolean = true
संपादित - यहाँ टॉमस Mikula को कुछ संशोधनों के धन्यवाद के साथ एक और संशोधन है:
import scala.language.implicitConversions
object Lazy {
def lazily[A](f: => A): Lazy[A] = new Lazy(f)
implicit def evalLazy[A](l: Lazy[A]): A = l()
}
class Lazy[A] private(f: => A) {
private var option: Option[A] = None
def apply(): A = option match {
case Some(a) => a
case None => val a = f; option = Some(a); a
}
def isEvaluated: Boolean = option.isDefined
}
इस की मदद से आप lazily { ... }
बजाय new Lazy { ... }
, और optionalSubsystem
बजाय optionalSubsystem()
लिखें।
scala> import Lazy._
import Lazy._
scala> val optionalSubsystem = lazily { "a" }
optionalSubsystem: Lazy[String] = [email protected]
scala> optionalSubsystem.isEvaluated
res0: Boolean = false
scala> optionalSubsystem: String
res1: String = a
scala> optionalSubsystem.isEvaluated
res2: Boolean = true
स्रोत
2013-06-12 04:05:22
नहीं, लेकिन क्या निर्धारित करता है कि वैकल्पिक सबसिस्टम को लाया जा रहा है या नहीं? क्या यह रनटाइम जानकारी है? या संकलन समय की जानकारी? – stew
सभी रनटाइम। मुझे एक रास्ता मिला: 'वैकल्पिक सबसिस्टम' का दुष्प्रभाव है-यह एक अभिनेता को बूट करता है। मैं साइड इफेक्ट की जांच करता हूं, जब तक इसका उत्तर बेहतर न हो जाए। –
"मैं एक अक्का अभिनेता को बूट करता हूं। अगर अभिनेता बूट हो जाता है, तो मैं इसकी निगरानी करना चाहता हूं"। इस मामले का उपयोग प्रश्न में कहा जाना चाहिए, अगर आप वास्तव में जानना चाहते हैं। –