2011-01-05 19 views
20

ट्रैवर्सबल और ट्रैवर्सबल के लिए स्केलैडोक को देखते हुए, मुझे यह पता लगाना मुश्किल हो रहा है कि उनके बीच क्या अंतर है (सिवाय इसके कि कोई दूसरा विस्तार करता है)। दस्तावेज़ीकरण में एकमात्र स्पष्ट अंतर यह है कि यह कहता है कि ट्रैवर्सबल एक "विशेषता" है और ट्रैवर्सबल लाइक एक "टेम्पलेट विशेषता" है। लेकिन "टेम्पलेट विशेषता" के लिए googling इस शब्द के लिए एक परिभाषा प्रकट नहीं करता है। मदद!"विशेषता" और "टेम्पलेट विशेषता" के बीच क्या अंतर है?

उत्तर

21

मैंने स्कैला में सामान्य उपयोग में इस शब्दावली को नहीं देखा है, और मुझे लगता है कि यह स्कैला संग्रह API के डिज़ाइन के लिए विशिष्ट है। आप The Architecture of Scala Collections (विशेष रूप से "सामान्य परिचालनों को फैक्टरिंग" पर अनुभाग) [1] और the Scala collections SID पढ़कर और जान सकते हैं।

ऐसे traversable या वेक्टर के रूप में

संग्रह कक्षाएं एक कार्यान्वयन विशेषता से सभी उनके ठोस विधि कार्यान्वयन के वारिस: हालांकि वे के रूप में "कार्यान्वयन लक्षण" वहाँ के लिए भेजा रहे सिड की §4.2, प्रासंगिक है। इन लक्षणों का नाम लाइक पीफ एक्स के साथ रखा गया है; उदाहरण के लिए वेक्टर लॉइक वेक्टर और ट्रैवर्सबल के लिए कार्यान्वयन विशेषता है ट्रैवर्सबल के लिए कार्यान्वयन विशेषता है।

संक्षेप में, अपने उद्देश्य संग्रह पदानुक्रम के बाहर उपयोग के लिए अलग कार्यान्वयन के लिए दोनों है (उदाहरण के StringOpsTraversableLike नहीं बल्कि Traversable फैली) और इस तरह से कि संग्रह प्रकार संरक्षित रखा जाता है में आम अभियान कारक (IttayD's answer देखना एक और पूरी तरह से स्पष्टीकरण के लिए)।

मुझे ध्यान रखना चाहिए कि जब तक आप संग्रह पदानुक्रम को विस्तारित नहीं कर रहे हैं, तब तक आपको इन कक्षाओं से संबंधित होने की आवश्यकता नहीं है। सामान्य उपयोग के लिए, Traversable, Iterable, Seq, आदि लक्षणों पर ध्यान केंद्रित करें। यदि आप स्कैला कलेक्शन एपीआई में नए हैं, तो मैं Scala 2.8 Collection API document से शुरू करने का सुझाव दूंगा, फिर आवश्यकतानुसार scaladoc का संदर्भ लें। आप स्कालाडोक के माध्यम से देख रहे 'बड़ी तस्वीर' पाने की उम्मीद नहीं कर सकते हैं।

[1] क्रेडिट इस लिंक

+2

आपके उत्कृष्ट उत्तर के लिए धन्यवाद! हालांकि, आखिरी वाक्य ने मुझे थोड़ा सा दुख लगाया: "आप स्कालाडोक के माध्यम से 'बड़ी तस्वीर' पाने की उम्मीद नहीं कर सकते हैं" - कितना दुर्भाग्यपूर्ण ... मुझे लगता है कि जावा मानक पुस्तकालय के मामले में (कम से कम "कोर" पैकेज java.lang, java.util, आदि के लिए जो 1.1 के आसपास से हैं) कि मैं जावडोक को देखकर बड़ी तस्वीर प्राप्त करने में सक्षम था। – Adam

22

XXXLike लक्षण Repr सामान्य पैरामीटर जोड़ने का एक महत्वपूर्ण भूमिका के लिए michid को जाता है। विधियों को एक ही संग्रह प्रकार को वापस करने के लिए माना जाता है, जैसे फ़िल्टर, मानचित्र, फ्लैटमैप, निम्न स्तर के लक्षणों (ट्रैवर्सबल लाइक) में कार्यान्वित किए जाते हैं। उनकी वापसी प्रकार सांकेतिक शब्दों में बदलना करने के लिए, उन लक्षण इसे प्राप्त:

trait TraversableLike[+A, +Repr] ... 
    ... 
    def filter(p: A => Boolean): Repr = { 

(नक्शा और flatMap के लिए इस मुद्दे को अधिक जटिल है, मैं इस पर यहाँ नहीं जाना होगा)

अब मान लीजिए कि आप के एक नए प्रकार है संग्रह। आप कर सकता है:

trait MyCollection[+A] extends TraversableLike[A, MyCollection] 

लेकिन फिर अगर कोई अपने संग्रह का विस्तार करने के लिए करना चाहता है, वे विभिन्न विरासत में मिला तरीकों से MyCollection की वापसी मान के साथ फंस रहे हैं।

बजाय, आपके द्वारा बनाए गए:

trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr] 

और

trait MyCollection[+A] extends MyCollectionLike[A, MyCollection] 

और किसी को भी अपने संकलन को बढ़ाएं करना चाहता है कि फैली MyCollectionLike

+0

IttayD, यह स्कैला वेबसाइट पर अक्सर पूछे जाने वाले प्रश्न # 1 होना चाहिए। इस "इस विधि के वापसी प्रकार विरासत वर्ग के समान हैं" को कम करने के कम से कम तीन अलग-अलग तरीके हैं - यह जानकर कि स्कैला संग्रह पुस्तकालय (और इसलिए संभावित रूप से पसंदीदा तंत्र) के लिए कौन सा उपयोग किया गया था अधिक स्कैला शुरुआती दिखाना चाहिए। – Adam

1

[...] की तरह कक्षाएं कार्यान्वयन वर्ग हैं वास्तविक संग्रह कक्षाओं के लिए।एक अर्थ में वे टेम्पलेट कार्यान्वयन की तरह कार्य करते हैं, जिनमें से अधिकांश - यदि सभी नहीं - वास्तविक संग्रह वर्गों द्वारा व्यवहार विरासत में मिलता है।

बहुत विस्तृत और पहुंच योग्य अवलोकन के लिए The Architecture of Scala Collections पढ़ें।

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