ध्यान दें कि आप explicit implicit पैटर्न का उपयोग कर सकते हैं जो भ्रम से बचें और एक ही समय में कोड terse रखें।
मैं स्पष्ट अंतर्निहित से क्या मतलब बजाय Option[T]
को T
से एक प्रत्यक्ष रूपांतरण है आप एक आवरण वस्तु जो T
से Option[T]
करने के लिए रूपांतरण करने के लिए साधन प्रदान करता है के लिए एक रूपांतरण हो सकता है।
class Optionable[T <: AnyRef](value: T) {
def toOption: Option[T] = if (value == null) None else Some(value)
}
implicit def anyRefToOptionable[T <: AnyRef](value: T) = new Optionable(value)
... मैं Optionable
की तुलना में यह करने के लिए एक बेहतर नाम मिल सकती है, लेकिन अब आप कोड लिख सकते हैं जैसे:
val x: String = "foo"
x.toOption // Some("foo")
val y: String = null
x.toOption // None
मुझे विश्वास है कि इस तरह से पूरी तरह से पारदर्शी है और की समझ में एड्स लिखित कोड - एक अच्छे तरीके से शून्य के लिए सभी चेक को खत्म करना।
T <: AnyRef
पर ध्यान दें - आपको केवल उन उदाहरणों के लिए यह निहित रूपांतरण करना चाहिए जो null
मानों को अनुमति देते हैं, जो परिभाषा संदर्भ प्रकार हैं।
स्रोत
2009-11-17 07:29:30
कम से कम इंटेलिजे आईडीईए में मैं देख सकता हूं कि कुछ ऑटो-रूपांतरित हो जाता है (डिफ़ॉल्ट रूप से इसे रेखांकित किया जाता है)। लेकिन शायद यह निर्दिष्ट करने का एक तरीका होना चाहिए कि किसी विधि को मूल्य पारित करते समय एक अंतर्निहित रूपांतरण केवल तभी होना चाहिए, जब उस पर कोई विधि कॉल न हो। – herman