2010-04-23 6 views
16
scala> val a = Array [Double] (10) 
a: Array[Double] = Array(10.0) 

scala> val a = new Array [Double] (10) 
a: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0) 

इन दो अभिव्यक्तियों में अलग-अलग अर्थशास्त्र क्यों हैं?स्कैला ऐरे कन्स्ट्रक्टर?

+0

स्कैला में ऐरे प्रबंधन एक कीट है .. केवल तभी संभव है जब आप जमे हुए आधार – sub

+3

ए "जमे हुए आधार" पर विकास कर रहे हों? यह सच सरणी उपचार 2.7 से 2.8 तक काफी बदल गया है, लेकिन मुझे लगता है कि हम इसके बाद स्थिर रहने की उम्मीद कर सकते हैं। अब स्कैला ऐरे जावा ऐरे है। स्कैला की "अतिरिक्त" सरणी कार्यक्षमता को implicits के माध्यम से संभाला जाता है। –

+0

इम्प्लिकेट्स ऐरे को अधिक कार्यक्षमता प्राप्त करने की अनुमति कैसे देते हैं? –

उत्तर

42

यह थोड़ा भ्रामक है, लेकिन स्काला कक्षाएं जो आप के उदाहरण बना सकते हैं, और वस्तुओं, जो मूल रूप से एक वर्ग के सिंगलटन उदाहरण हैं की धारणा है। इसमें साथी वर्ग की धारणा भी है, जो एक वर्ग की एक जोड़ी है और एक ही नाम वाला ऑब्जेक्ट है। यह तंत्र अनिवार्य रूप से स्थैतिक तरीकों के लिए "वर्ग" की अनुमति देता है, जो स्कैला में अन्यथा संभव नहीं है।

Array दोनों एक वर्ग और एक साथी वस्तु है। इसके अलावा, Array object में apply विधि है। apply का अर्थ है कि आप Array(arg) के साथ एक ऑब्जेक्ट बना सकते हैं। लेकिन क्योंकि Array एक साथी वर्ग है, इसमें एक निर्माता भी है जिसे new Array(arg) के अधिक सामान्य तंत्र के माध्यम से बुलाया जा सकता है।

मुद्दा यह है कि Array वस्तु में applyArray कंस्ट्रक्टर्स की तुलना में अलग अर्थ विज्ञान है। apply विधि निर्दिष्ट ऑब्जेक्ट्स से एक सरणी बनाता है, इसलिए, उदाहरण के लिए, Array(1,2,3) ऑब्जेक्ट्स 1, 2, और 3 से युक्त एक सरणी देता है। दूसरी ओर, कन्स्ट्रक्टर, तर्क लेते हैं जो सरणी के आयामों का आकार निर्दिष्ट करते हैं (ताकि आप बहुआयामी सरणी बना सकें), और फिर सभी स्लॉट को डिफ़ॉल्ट मान पर प्रारंभ करें।

तो, मूल रूप से:

  • val a = Array [Double] (10) कॉल Arrayवस्तु है, जो दिए गए वस्तुओं से युक्त एक नई सरणी बनाता है पर apply विधि।
  • val a = new Array [Double] (10)Array कन्स्ट्रक्टर को कॉल करता है, जो 10 स्लॉट के साथ एक नई सरणी बनाता है, सभी 0.0 के डिफ़ॉल्ट मान के लिए प्रारंभ किए जाते हैं।
+0

ग्रेट उत्तर। धन्यवाद! –

+0

@ मिपाडी, डिफ़ॉल्ट स्लॉट के रूप में 10 स्लॉट और 1 के साथ एक नई सरणी कैसे बनाएं? धन्यवाद – city

+0

@city 'val a = Array.fill (10) {1}' –

10

new Array[Double](10) जावा में new double[10] के बराबर होना चाहिए।

लेकिन स्कैला अपने संग्रह वर्गों के अनुरूप सिंगलटन पर सुविधा विधियां भी प्रदान करता है, और Array कोई अपवाद नहीं है।

इस प्रकार, यदि आप List(1,2,3,4,5) कह सकते हैं तो यह प्राकृतिक लगता है कि आप Array(1,2,3,4,5) भी कह सकते हैं। और आप कर सकते है।

लेकिन यह new शब्द या नहीं जोड़ता है, इसके आधार पर यह अलग-अलग परिणामों की थोड़ी अजीब स्थिति में छोड़ देता है या नहीं। प्रतिस्पर्धी हितों को देखते हुए, मुझे लगता है कि यह समग्र रूप से सबसे अच्छा समाधान है, लेकिन इसमें थोड़ा सा उपयोग किया जाता है।