स्कैला 2.10 मूल्य वर्ग प्रस्तुत करता है, जिसे आप अपनी कक्षा AnyVal
बढ़ाकर निर्दिष्ट करते हैं। मूल्य वर्गों पर कई प्रतिबंध हैं, लेकिन उनके बड़े फायदों में से एक यह है कि वे एक नई कक्षा बनाने के दंड के बिना विस्तार विधियों की अनुमति देते हैं: जब तक कि मुक्केबाजी की आवश्यकता न हो। मूल्य वर्ग को सरणी में रखने के लिए, यह केवल पुरानी कक्षा है और विधियों का एक सेट है जो कक्षा को पहले पैरामीटर के रूप में लेता है। इस प्रकार,आप बिना ओवरहेड के मूल्य वर्गों को कैसे समृद्ध करते हैं?
implicit class Foo(val i: Int) extends AnyVal {
def +*(j: Int) = i + j*j
}
कुछ है कि i + j*j
लेखन अपने आप को (एक बार JVM विधि कॉल inlines) से अधिक नहीं महंगा हो सकता है के लिए unwraps।
दुर्भाग्य से, SIP-15 जो मूल्य वर्गों का वर्णन में प्रतिबंध में से एक है
- सी के अंतर्निहित प्रकार एक मूल्य वर्ग नहीं हो सकता।
आप एक मूल्य वर्ग है कि आप पर कहते हैं, अपने हाथों को प्राप्त कर सकते हैं एक तरह से मुक्केबाजी के उपरि बिना टाइप सुरक्षित इकाइयों प्रदान करने के लिए (जब तक आप वास्तव में इसकी जरूरत) के रूप में है, तो:
class Meter(val meters: Double) extends AnyVal {
def centimeters = meters*100.0 // No longer type-safe
def +(m: Meter) = new Meter(meters+m.meters) // Only works with Meter!
}
तो ऑब्जेक्ट-निर्माण ओवरहेड के बिना Meter
को समृद्ध करने का कोई तरीका है? एसआईपी -15 में प्रतिबंध स्पष्ट
implicit class RichMeter(m: Meter) extends AnyVal { ... }
दृष्टिकोण को रोकता है।
यह एसआईपी -15 की निगरानी की तरह लगता है, क्योंकि यह सीधे सहेजे गए वर्बोजिटी 'निहित वर्ग' प्रदान करता है। क्या अधिक जानकारी के लिए कोई लिंक हैं कि क्यों मूल्य वर्ग में अंतर्निहित प्रकार के रूप में मूल्य वर्ग नहीं हो सकता है? (संकलक सीमाएं, कार्यान्वयन की जटिलता, या अन्यथा) –
@AlexDiCarlo - मूल्य वर्गों पर बहुत से प्रतिबंध हैं जो तर्कसंगत रूप से आवश्यक नहीं हैं, इसलिए मेरी धारणा यह है कि कार्यान्वयन को सरल बनाने के लिए यह किया गया था। –