2013-02-12 37 views
5

हम तो अपरिवर्तनीय नक्शा आयात करने के लिएस्कैला मानचित्र ऑटो-आयात क्यों किया जाता है लेकिन हैश मैप नहीं है?

scala> val map=Map[String,Int]() 
map: scala.collection.immutable.Map[String,Int] = Map() 

लेकिन अगर हम HashMap उपयोग करते हैं, तो आयात कर के बिना, यह त्रुटि देता है की कोई जरूरत के नक्शे का उपयोग करते हैं।

scala> val a=HashMap[Int,Int]() 
<console>:7: error: not found: value HashMap 
     val a=HashMap[Int,Int]() 
      ^

लेकिन आयात scala.collection.immutable.HashMap, यह काम करता है।

मैं भी सेट और HashSet साथ इसे देख ..

मैं एक बात है कि मानचित्र और सेट विशेषता और HashSet दिखाई देते हैं, HashMap वर्ग हैं।

तो ऐसा क्यों है ???

संपादित

कक्षा ढेर और कतार है भी scala.collection पैकेज में मौजूद हैं। तो हमें इन कक्षाओं को आयात करने की आवश्यकता क्यों है। ???

+0

'' 'वैल नक्शा = मानचित्र()' '' के बाद से मानचित्र अपरिवर्तनीय है, एक ही बात करना होगा। और '' '> मानचित्र + (" अहो "-> 0)' '' काम करता है, कॉन्वर्सिस के लिए धन्यवाद। – jwinandy

+0

स्टैक और कतार के लिए, मुझे लगता है कि वे सूची, सेट और मानचित्र से बहुत कम उपयोग किए जाते हैं। –

+0

मुझे यकीन नहीं है लेकिन मुझे लगता है, ये हैश मैप जैसे वर्ग हैं। इसलिए वे आपके जवाब के रूप में ऑटो आयात नहीं कर रहे हैं "एक इंटरफेस के लिए कार्यक्रम, कार्यान्वयन नहीं" सुझाव देता है। – Rishi

उत्तर

14

Program to an interface, not an implementation। स्कैला डिजाइनरों ने प्रीडफ में इंटरफेस के लिए शॉर्टकट प्रदान करके इसे प्रोत्साहित किया।

3

ऐसा इसलिए है क्योंकि Predef स्पष्ट रूप से आयात किया गया है। दूसरों के बीच, इसमें Map जैसे सामान्य लक्षणों के लिए कारखाने के तरीके शामिल हैं। HashMap एक ठोस कार्यान्वयन है, इसलिए यदि आपने टाइप फैक्टर के साथ अपनी फैक्ट्री विधि का उपयोग किया है, तो आप एक घोषणा के लिए अपनी घोषणा को कसकर जोड़ देंगे।

+0

प्रिडफ में नक्शा क्यों सूचीबद्ध है, जबकि हैश मैप नहीं? –

1

स्कैला में, यह अपरिवर्तनीय प्रकारों को पसंद करने के लिए मूर्खतापूर्ण है, इसलिए वे डिफ़ॉल्ट रूप से उपलब्ध कराए जाते हैं। यदि आप उत्परिवर्तन चाहते हैं तो आपको स्पष्ट रूप से ऐसा कहना होगा।

एक अन्य संभावित कारण है (और मैं सिर्फ अनुमान लगा रहा हूँ) है कि HashMap एक मानचित्र है, और कई मामलों में आप वास्तव में परवाह नहीं है क्या मानचित्र के ठोस कार्यान्वयन आप प्राप्त है, तो आप सिर्फ कुछ है कि कुंजी संबद्ध कर सकते हैं चाहता हूँ मूल्यों के साथ और उचित तेज़ लुकअप है। इसलिए यह हैसएरे मैप्डट्री ("foo" -> "bar") की तुलना में मानचित्र ("foo" -> "bar") कहने के लिए और अधिक अमूर्त है।

+0

लेकिन अगर हम scala.collection.immutable.Queue आयात किए बिना अपरिवर्तनीय कतार का उपयोग करने का प्रयास करेंगे, तो यह काम नहीं करता है। जबकि मानचित्र और कतार दोनों scala.collection पैकेज में हैं। ऐसा क्यों है ?? – Rishi

+1

जैसा कि थॉफ्ट नीचे बताता है, ऐसा इसलिए है क्योंकि 'स्प्रैफ़' को सभी स्कैला ऐप्स में स्वचालित रूप से आयात किया जाता है। नक्शा उपलब्ध होने के लिए [यह लाइन] देखें (https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Predef.scala#L97)। – overthink

+0

Altough यह ध्यान रखना महत्वपूर्ण है कि उत्परिवर्तनीय लोगों पर अपरिवर्तनीय प्रकारों को प्राथमिकता दी जाती है, वास्तव में एक अपरिवर्तनीय हैश मैप कार्यान्वयन होता है, इसलिए आपका दूसरा कारण अधिक महत्वपूर्ण हो सकता है। – thSoft

0

यह शायद इस संग्रह वर्ग के पदानुक्रम के साथ क्या करना है:

enter image description here

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

  • कोई संबंधित समस्या नहीं^_^