यह एक बहुत पुराना विषय है लेकिन एक अच्छा है!
यह सही है कि ट्राय टू ऑप्शन के किसी भी गैर-अपवाद परिणाम को परिवर्तित करने के परिणामस्वरूप कुछ ...
scala> Try(null).toOption
res10: Option[Null] = Some(null)
... क्योंकि कोशिश शून्यता की जाँच के बारे में नहीं है, बल्कि अपवादों को कार्यात्मक रूप से संभालने का एक तरीका है।
एक अपवाद को पकड़ने की कोशिश करना और इसका उपयोग करना कि सुविधा के लिए एक विकल्प में परिवर्तित करना केवल एक अपवाद होने की स्थिति में कोई नहीं दिखाएगा।
scala> Try(1/0).toOption
res11: Option[Int] = None
आप उन मूल्यों को संरक्षित करना चाहते हैं जो ट्राई से बाहर आते हैं। वह अशक्त हो सकता है।
लेकिन यह भी सच है कि मानक कभी-कभी काफी भ्रमित होता है ...
scala> Try(null).toOption
res12: Option[Null] = Some(null)
scala> Option(null)
res13: Option[Null] = None
यह व्यवहार थोड़ा असंगत है लेकिन यह एक तरह से कोशिश और विकल्प दोनों के उपयोग को दर्शाता है।
आप एक अभिव्यक्ति से बाहर आने के लिए कोशिश करते हैं जो अपवादों को फेंक सकता है, और आप अपवाद के बारे में परवाह नहीं करते हैं।
जो मूल्य निकल सकता है वह बहुत अच्छी तरह से अशक्त हो सकता है। अगर ऑक्शन ने किसी को नहीं दिया, तो आप एक अपवाद और अशक्त के बीच अंतर नहीं कर सकते , और यह सुंदर नहीं है!
स्टैंडअलोन, आप किसी चीज़ के अस्तित्व को रोकने के लिए विकल्प का उपयोग करते हैं। तो उस मामले में कुछ (अशक्त) कोई नहीं है, और यह समझ में आता है, क्योंकि उस मामले में अशक्त कुछ की अनुपस्थिति का प्रतिनिधित्व करता है। यहां कोई अस्पष्टता नहीं है।
यह बताना महत्वपूर्ण है कि किसी भी मामले में रेफ़ेंसियल ट्रांसपेरेंसी तब से नहीं टूटी है। विकल्प ऑप्शन के रूप में समान नहीं है ()
यदि आपको वास्तव में बीओटीएच अपवाद सुरक्षा और अशक्त सुरक्षा को लागू करने की आवश्यकता है , और आपके कोड को वास्तव में अशक्त और अपवाद के बीच अंतर करने की आवश्यकता नहीं है , तो आपको बस दोनों प्रतिमानों को संयोजित करने की आवश्यकता है! क्योंकि ठीक है, कि तुम क्या चाहते हो, है ना?
आप इसे एक तरह से कर सकते हैं ...
scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None
scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None
scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)
... या एक और ...
scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None
scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None
scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)
... या हास्यास्पद रूप से उनमें से एक माँ ...
scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None
scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None
scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)