स्काला में, हम मौजूदा या नए प्रकारों को वापस करने के लिए कम से कम दो तरीकों का उपयोग कर सकते हैं। मान लीजिए कि हम यह व्यक्त करना चाहते हैं कि कुछ का उपयोग करके मात्रा निर्धारित की जा सकती है Int
। हम निम्नलिखित विशेषता को परिभाषित कर सकते हैं।
निष्प्राण रूपांतरण
trait Quantifiable{ def quantify: Int }
और फिर हम उदाहरणार्थ स्ट्रिंग्स और सूचियों को निर्धारित करने के लिए अंतर्निहित रूपांतरण का उपयोग कर सकते हैं।
implicit def string2quant(s: String) = new Quantifiable{
def quantify = s.size
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{
val quantify = l.size
}
इन्हें आयात करने के बाद, हम quantify
स्ट्रिंग्स और सूचियों पर विधि को कॉल कर सकते हैं । ध्यान दें कि मात्रात्मक सूची इसकी लंबाई को संग्रहीत करती है, इसलिए यह बाद के कॉल पर सूची के महंगे ट्रैवर्स से बचा जाता है quantify
।
कक्षाएं टाइप करें
एक विकल्प एक "गवाह" को परिभाषित करना है Quantified[A]
जो बताता है कि कुछ प्रकार की A
मात्रा निर्धारित की जा सकती है।
trait Quantified[A] { def quantify(a: A): Int }
हम तब String
और List
कहीं के लिए इस प्रकार के वर्ग के उदाहरण देते हैं ।
implicit val stringQuantifiable = new Quantified[String] {
def quantify(s: String) = s.size
}
और अगर हम तब एक विधि लिखते हैं जिसे अपने तर्कों को निर्धारित करने की आवश्यकता होती है, हम लिखते हैं:
def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) =
as.map(ev.quantify).sum
या संदर्भ बाध्य सिंटैक्स का उपयोग कर:
def sumQuantities[A: Quantified](as: List[A]) =
as.map(implicitly[Quantified[A]].quantify).sum
लेकिन कब किस विधि का उपयोग करें?
अब सवाल आता है। मैं उन दो अवधारणाओं के बीच कैसे निर्णय ले सकता हूं?
मैंने अब तक क्या देखा है।
कक्षाएं टाइप करें
- टाइप कक्षाएं अच्छा संदर्भ बाध्य वाक्यविन्यास की अनुमति देती हैं
- प्रकार कक्षाओं के साथ मैं प्रत्येक उपयोग पर एक नया आवरण वस्तु नहीं बनाता
- यदि प्रकार वर्ग में कई प्रकार के पैरामीटर हैं, तो संदर्भ बाध्य सिंटैक्स अब काम नहीं करता है; कल्पना कीजिए कि मैं न केवल पूर्णांकों के साथ बल्कि कुछ सामान्य प्रकार के मूल्यों के साथ चीजों को मात्रा देना चाहता हूं
T
। मैं एक टाइप क्लास बनाना चाहूंगाQuantified[A,T]
निहितार्थ
- जब से मैं एक नई वस्तु बनाता हूं, मैं वहां मूल्यों को कैश कर सकता हूं या बेहतर प्रतिनिधित्व कर सकता हूं; लेकिन मुझे इससे बचना चाहिए, क्योंकि यह कई बार हो सकता है और एक स्पष्ट रूपांतरण शायद केवल एक बार ही होगा?
मुझे जवाब से क्या उम्मीद है
वर्तमान एक (या अधिक) केस केस (एस) का उपयोग करें, जहां दोनों अवधारणाओं के बीच अंतर मायने रखता है और समझाता है कि मैं दूसरे पर क्यों पसंद करूंगा। साथ ही दो अवधारणाओं का सार और एक दूसरे से उनके संबंध को स्पष्ट करना, उदाहरण के बिना भी अच्छा होगा।
size
एक मूल्य की किसी सूची की और कहते हैं कि इसका हिसाब लगाना आगामी कॉल पर सूची की महंगी ट्रेवर्सल से बचा जाता है, लेकिन करने के लिए अपने हर कॉल पर ट्रिगर किया जाता है इस तरह से फिर से संपत्ति की भरपाई और पुनर्मूल्यांकन किया जा रहा है। मैं जो कह रहा हूं वह यह है कि वास्तव में निहित रूपांतरण के साथ परिणामों को कैश करने का कोई तरीका नहीं है। quantify
list2quantifiable
Quantifiable
quantify