2010-10-06 12 views

उत्तर

2

मेरा मानना ​​है कि वहाँ एक है नहीं है। आप नल कोलेसिंग ऑपरेटर के कार्यान्वयन के लिए this पोस्ट देख सकते हैं।

10

आप अपने आप को समान अर्थशास्त्र के साथ लिख सकते हैं - यहां एक ऐसा है जो बाएं से दाएं मूल्यांकन के कारण पूरे प्रकार पर जोर देता है, लेकिन कोई इसे बदल सकता है?: दाएं से बाएं मूल्यांकन प्राप्त करने के लिए प्रकार चौड़ा रूप में की जरूरत:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a } 
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a) 

scala> (null:String) ?? (null:String) ?? "(default value)" 
res0: String = (default value) 

लेकिन कारण है कि इस ऑपरेटर मौजूद नहीं है हो सकता है कि Option इस तरह के परिदृश्यों के साथ-साथ न के बराबर मूल्यों की हैंडलिंग के कई इसी तरह के मामलों से निपटने का पसंदीदा तरीका है:

scala> List((null:String),(null:String),"(default value)").flatMap(Option(_)).headOption 
res72: Option[java.lang.String] = Some((default value)) 

(यदि आप थे सुनिश्चित करें कि कम से कम एक गैर-शून्य था, आप बस head का उपयोग कर सकते हैं; ध्यान दें कि यह काम करता है क्योंकि Option(null)None में धर्मान्तरित और flatMap एक साथ बटोरता केवल Some(_) प्रविष्टियों।)

+2

मुझे विश्वास है कि यह 'def ?? (बी: => ए)' होना चाहिए अर्थात् समानताएं बनाना। मुझे लगता है कि एल्विस ऑपरेटर के दाहिने तरफ का मूल्यांकन नहीं किया जाना चाहिए जब तक कि 'ए' शून्य न हो। यद्यपि गलत हो सकता है। – sinharaj

+0

@ सिंहाज - आप शायद सही हैं। मैं परिचित नहीं हूं कि सी # यह कैसे करता है। –

3

getOrElse की कोशिश करो। मेरे दोस्त ने सुझाव दिया।

+0

कोई उचित ऑपरेटर नहीं है लेकिन सरल अभिव्यक्तियों के लिए आसान हो सकता है: 'विकल्प (शून्य: स्ट्रिंग) .getOrElse (" डिफ़ॉल्ट मान ")' या 'विकल्प (विकल्प (शून्य: स्ट्रिंग) .getOrElse (शून्य: स्ट्रिंग))। GetOrElse ("डिफ़ॉल्ट मान") ' – karmakaze

2

लिंक किए गए उत्तर को देखें, लेकिन, बिंदु पर अधिक, nulls से बचाता है। विकल्प का प्रयोग करें।

1

This blog post कैसे ग्रूवी के "एल्विस ऑपरेटर ?:" स्काला में लागू करने के लिए शामिल किया गया। यह सी # के ?? ऑपरेटर के समान ही काम करता है।