2010-03-19 13 views
24

जहां तक ​​मैं समझता हूं, स्कैला == दो वस्तुओं की प्राकृतिक समानता को परिभाषित करता है।`ऐरे (0,1,2) == ऐरे (0,1,2)` अपेक्षित परिणाम क्यों नहीं लौटाता है?

मुझे उम्मीद है कि Array(0,1,2) == Array(0,1,2) प्राकृतिक समानता की तुलना करता है। उदाहरण के लिए, जांच करता है कि अन्य सरणी के संबंधित तत्वों की तुलना में सरणी के सभी तत्व सत्य लौटते हैं या नहीं।

लोगों ने मुझे बताया कि स्कैला का Array सिर्फ जावा [] है जो केवल पहचान की तुलना करता है। प्राकृतिक समानता की तुलना करने के लिए Array की equals विधि को ओवरराइड करना अधिक अर्थपूर्ण नहीं होगा?

+0

मैं स्कैला से परिचित नहीं हूं। हालांकि, क्या आप निश्चित हैं कि == तुलना नहीं कर रहा है कि सरणी उपनाम हैं (स्मृति में एक ही वस्तु के संदर्भ) या नहीं? मुझे लगता है कि यह एक संभावना है, क्योंकि आपने जावा सरणी से संबंधित होने का उल्लेख किया है। – Cam

+1

यह एक दुर्भाग्यपूर्ण स्थिति है, जैसा कि अन्य उत्तरों का वर्णन है, लेकिन जब आप जानते हैं कि आप ऐरे से निपट रहे हैं, तो आप उसी एलीमेंट्स का उपयोग कर सकते हैं और सभी रैपिंग और मुक्केबाजी और circumlocutions से परहेज करते हुए आप जो जवाब चाहते हैं उसे प्राप्त कर सकते हैं। –

उत्तर

19

स्कैला 2.7 ने जावा [] सरणी में कार्यक्षमता जोड़ने की कोशिश की, और कोने के मामलों में भाग गया जो समस्याग्रस्त थे। स्कैला 2.8 ने घोषणा की है कि Array[T]T[] है, लेकिन यह रैपर और समकक्ष प्रदान करता है।

2.8 में निम्नलिखित का प्रयास करें (संपादित करें/ध्यान दें: RC3 के रूप में, GenericArray इस ओर इशारा करते हुए के लिए Retronym को ArraySeq --thanks है):

import scala.collection.mutable.{GenericArray=>GArray, WrappedArray=>WArray} 
scala> GArray(0,1,2) == GArray(0,1,2) 
res0: Boolean = true 

scala> (Array(0,1,2):WArray[Int]) == (Array(0,1,2):WArray[Int]) 
res1: Boolean = true 

GenericArray सिर्फ Array की तरह कार्य करता है, सभी स्काला साथ छोड़कर संग्रह गुड्स में जोड़ा गया। WrappedArray जावा [] सरणी लपेटता है; ऊपर, मैंने इसे एक सादा सरणी डाली है (अंतर्निहित रूपांतरण फ़ंक्शन को कॉल करने से आसान) और फिर लपेटा हुआ सरणी की तुलना की गई है। ये रैपर, हालांकि [] सरणी द्वारा समर्थित, आपको सभी संग्रह उपहार भी प्रदान करते हैं।

+0

क्या ई के बजाए इन कक्षाओं का उपयोग करने से कोई प्रदर्शन/स्मृति/टाइपिंग/... लाभ हैं। जी। तब एक सूची? मैं कल्पना कर सकता हूं कि जेनेरिकअरे/लपेटा हुआ ऐरे काफी ओवरहेड जोड़ता है ... – soc

+1

नहीं, असल में, वे बहुत कम ओवरहेड जोड़ते हैं - 'लपेटा हुआ ऐरे' एक सादा जावा सरणी के चारों ओर लपेटा गया एक अतिरिक्त वर्ग है। 'सूची' के लिए प्रत्येक एकल तत्व_ के आस-पास एक अतिरिक्त कक्षा की आवश्यकता होती है। आप उपयोग की आसानी और कूल पैटर्न मिलान और अपरिवर्तनीयता की वजह से सूचियों का उपयोग करते हैं, दक्षता के लिए नहीं। 'जेनेरिकअरे' की थोड़ी अजीब स्थिति है, हालांकि, एक निश्चित आकार सरणी के रूप में: आकार अपरिवर्तनीय है लेकिन सामग्री उत्परिवर्तनीय है।क्यों, कोई आश्चर्यचकित हो सकता है, न सिर्फ 'ऐरेबफर' का उपयोग करें? –

+1

प्रदर्शन के कारण आप एक अपरिवर्तनीय सूची का बहुत अच्छी तरह से उपयोग कर सकते हैं। अपरिवर्तनीय संग्रह आपको रक्षात्मक प्रतियां बनाने से बचा सकते हैं। आवेदन के आधार पर यह उनके ओवरहेड से अधिक हो सकता है। – ziggystar

5

लेकिन स्काला का स्ट्रिंग भी सिर्फ एक जावा स्ट्रिंग है, लेकिन स्काला को ओवरराइड करता है के बराबर होती है प्राकृतिक समानता तुलना करने के लिए।

स्कैला वहां कुछ भी ओवरराइड नहीं करता है; java.lang.String में equals() (कई अन्य जावा क्लासेस की तरह, लेकिन सरणी के विपरीत) का मान-निर्भर कार्यान्वयन है।

+0

हाय माइकल, धन्यवाद! मैंने तदनुसार अपना प्रश्न तय कर दिया। असल में मुझे आश्चर्य है कि क्यों संग्रह वर्गों की तरह प्राकृतिक समानता वापस करने के लिए बराबर नहीं है (मुझे पता है कि ऐरे संग्रह कक्षाओं से संबंधित नहीं है!)। – soc

+3

स्कैला '==' 'बराबर' के रूप में व्याख्या करता है। बस इतना ही। 'स्ट्रिंग' में' बराबर 'है जो कुछ संदर्भ पहचान से उपयोगी रूप से अलग करता है। '[]' नहीं है। –

8

स्कैला ऐरे की समानता को ओवरराइड नहीं करता है क्योंकि यह संभव नहीं है। उप-वर्गीकरण करते समय कोई केवल विधियों को ओवरराइड कर सकता है। चूंकि ऐरे को उप-वर्गीकृत नहीं किया जा रहा है (जो संभव नहीं है), स्कैला अपनी विधियों को ओवरराइड नहीं कर सकता है।

संबंधित मुद्दे