आप सही हैं; new
अनिवार्य नहीं है। वे बस के रूप में अच्छी तरह से इस तरह उदाहरण विधि List#::
परिभाषित किया जा सकता था:
def ::[U >: T](x: U): List[U] = scala.::(x, this)
(नोट है कि हम:
type :: = collection.immutable.::
val :: = collection.immutable.::
scala
पैकेज वस्तु में परिभाषित किया गया है, पहले यही कारण है कि अपने new scala.::(x, this)
काम करता है, और दूसरी बात यह है कि मेरा scala.::(x, this)
काम करता है।)
The form the library uses आपके जैसा काम करता है, सीधे निर्माता को कॉल करता है। विकल्प apply
::
केस क्लास के लिए जेनरेट की गई सिंथेटिक साथी ऑब्जेक्ट की विधि को कॉल करता है, जो कि कन्स्ट्रक्टर को वैसे भी कॉल करता है। शायद कन्स्ट्रक्टर को बुलाकर स्पष्ट, या अधिक कुशल समझा गया था? (। दक्षता लाभ कुछ भी नहीं के करीब है, हालांकि, होना चाहिए, क्योंकि यदि संकलक apply
करने के लिए कॉल इनलाइन नहीं करता है, JVM जाएगा) मैं सबसे संक्षिप्त रूप लगता है:
def ::[U >: T](x: U) = ::(x, this)
कुछ निराला के लिए गलत हो सकता है (यानी असंभव) पुनरावर्ती आमंत्रण की तरह, और किसी भी दर पर ::
नामक कक्षा के बीच भेद और List
विधि ::
नामक विधि को प्रभावित करती है, जो प्रोफेसर ओडर्स्की को पाठक समझ को अधिकतम करने के लिए अलग रखने के लिए दर्द होता है।
उम्मीद है कि इससे मदद मिलती है।
अंतिम केवल इसका मतलब है कि कक्षा को विस्तारित नहीं किया जा सकता है, इसका उदाहरण उदाहरण के साथ कुछ भी नहीं है :-)। केस क्लास मूल रूप से एक वर्ग है जिसे 'मैच केस' ब्लॉक में तुलना की जा सकती है। – aishwarya