स्कैला में, आपके द्वारा वर्णित अभिव्यक्ति का अर्थ है कि ?
नामक एक विधि को some
नामक ऑब्जेक्ट पर बुलाया जाता है। नियमित रूप से, वस्तुओं में ?
नामक विधि नहीं होती है। आप ?
विधि के साथ किसी ऑब्जेक्ट में अपना स्वयं का अंतर्निहित रूपांतरण बना सकते हैं जो null
नेस के लिए जांच करता है।
implicit def conversion(x: AnyRef) = new {
def ? = x ne null
}
ऊपर होगा, संक्षेप में, किसी भी वस्तु जिस पर आप विधि conversion
के दाहिने हाथ की ओर अभिव्यक्ति में विधि ?
फोन (जो करता?
विधि है) में परिवर्तित। उदाहरण के लिए, अगर आप इस:
"".?
संकलक की पहचान करेगा एक String
वस्तु नहीं ?
विधि है, और में यह पुनर्लेखन: एक दुभाषिया में
conversion("").?
इलस्ट्रेटेड (ध्यान रखें कि छोड़ सकते हैं .
वस्तुओं पर जब फोन करने के तरीकों):
scala> implicit def any2hm(x: AnyRef) = new {
| def ? = x ne null
| }
any2hm: (x: AnyRef)java.lang.Object{def ?: Boolean}
scala> val x: String = "!!"
x: String = "!!"
scala> x ?
res0: Boolean = true
scala> val y: String = null
y: String = null
scala> y ?
res1: Boolean = false
तो तुम लिख सकते हैं:
if (some ?) {
// ...
}
या अगर तर्क null
नहीं है आप एक ?
विधि है जो वस्तु पर निर्दिष्ट विधि आह्वान के साथ एक वस्तु में एक अंतर्निहित रूपांतरण बना सकते हैं - ऐसा:
scala> implicit def any2hm[T <: AnyRef](x: T) = new {
| def ?(f: T => Unit) = if (x ne null) f(x)
| }
any2hm: [T <: AnyRef](x: T)java.lang.Object{def ?(f: (T) => Unit): Unit}
scala> x ? { println }
!!
scala> y ? { println }
ताकि आप तो कर सकते थे लिखें:
some ? { _.toString }
बिल्डिंग (रिकर्सिवली) SOC के जवाब पर, आप ऊपर के उदाहरण में x
पर पैटर्न मैच परिष्कृत करने के लिए क्या कर सकते हैं ?
घ x
के प्रकार के आधार पर oes। : डी
IMO, डैनियल का जवाब नीचे सबसे उपयुक्त है। स्कैला के पास संभावित रूप से खाली मूल्यों से निपटने के लिए पहले से ही बहुत सारे समर्थन हैं - सीखने के लिए बेहतर है और इसका उपयोग नए '?' वाक्यविन्यास को implicits के साथ बनाने के लिए किया जाता है। – Bill
एक कारण यह 'बजाय null's साथ जाने के लिए' None's प्रदर्शन/स्मृति उपयोग हो सकता है - आप मक्खी पर निहित रूपांतरण से एक अल्पकालिक वस्तु आवंटन के बजाय एक 'Option' आवरण के आसपास रखने पसंद कर सकते हैं। अनुमोदित, बहुत से लोग JVM पर उच्च-प्रदर्शन कोड नहीं लिखते हैं, लेकिन फिर भी, मैं कहूंगा कि इसका उपयोग-मामलों में है। – axel22