2011-11-06 12 views
8

मैं "स्कैला 2ed में प्रोग्रामिंग" पढ़ रहा हूं। धारा 24.4 में, यह ध्यान दिया गया है कि इटेबल में कई विधियां हैं जिन्हें बिना किसी इटेटर के कुशलता से लिखा जा सकता है। तालिका 24.2 में इन विधियों को शामिल किया गया है। हालांकि, मुझे समझ में नहीं आता कि उनमें से कुछ को इटेटरेटर पर कुशलता से लागू क्यों नहीं किया जा सकता है। उदाहरण के लिए, zipWithIndex पर विचार करें।ज़ीपविथ इंडेक्स इटरबल में क्यों लागू किया गया है और ट्रैवर्सबल नहीं है?

def zipWithIndex[A1 >: A, That](implicit bf: CanBuildFrom[Repr, (A1, Int), That]): That = { 
    val b = bf(repr) 
    var i = 0 
    for (x <- this) { 
     b += ((x, i)) 
     i +=1 
    } 
    b.result 
    } 

इस परिभाषा को ट्रैवर्स करने के लिए क्यों नहीं ले जाएं? ऐसा लगता है कि कोड बिल्कुल वही हो सकता है और कुशलता में कोई अंतर नहीं होगा।

+0

बस 'traversable पर' zipWithIndex' के लिए एक उपयोग के मामले में जोड़ना चाहते थे '। क्या होगा यदि आप एक ट्रैवर्सबल से यादृच्छिक तत्व चुनने के लिए एक विधि लागू कर रहे हैं? तत्वों पर पुनरावृत्ति करते समय, आपको संभावनाओं के साथ मदद करने के लिए एक अनुक्रमणिका की आवश्यकता होती है, भले ही सूचकांक संरचना के साथ एक सतत स्थान के अनुरूप न हो। – schmmd

उत्तर

11

आप पूरी तरह से सही हैं, और आपके कार्यान्वयन को काम करना चाहिए। zipWithIndexIterable में परिभाषित करने के लिए कोई अच्छा कारण नहीं है और Traversable नहीं है; न तो ट्रैवर्सल के तहत तत्वों के आदेश के बारे में कोई गारंटी देता है।

(यह पर StackOverflow। आशा है मेरा पहला जवाब मैं उपयोगी गया है। :) अगर मैं गया है नहीं, कृपया मुझे बताओ है।)

+0

पूरी तरह से सहायक, आपके पास उसके लिए +6 है! मैं बस यह सुनिश्चित कर रहा था कि मुझे कुछ याद नहीं आ रहा है क्योंकि अध्याय स्पष्ट रूप से बताता है कि तालिका में विधियों को इटेबल में लागू किया गया है क्योंकि वे वहां आसान या अधिक कुशल हैं। – schmmd

10

Traversable जिस क्रम में तत्वों का दौरा किया जाएगा गारंटी नहीं है और केवल निम्न हस्ताक्षर के साथ एक foreach विधि को परिभाषित करने की आवश्यकता है: चूंकि इस विधि बस में प्रत्येक तत्व के लिए f कॉल करने के लिए की जरूरत है

def foreach[U](f: Elem => U): Unit 

किसी भी आदेश, तत्वों पर एक सूचकांक होने का अर्थ नहीं है क्योंकि ऑर्डर foreach के प्रत्येक आमंत्रण के लिए अलग हो सकता है।

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

+1

मैं मानता हूं कि सूचकांक 'ट्रैवर्सबल' (उदाहरण ग्राफ के लिए विचार करें) पर सार्थक नहीं हैं। विशेष रूप से, आप संग्रह * पर प्राप्त सूचकांक * के साथ कुछ भी करने में सक्षम नहीं होंगे। लेकिन हो सकता है कि आप किसी और चीज़ के लिए "लूप" इंडेक्स रखना चाहें (और यह सिर्फ 'लूप' के लिए एक सामान्य जावा-स्टाइल 'में' i 'रखने की नकल करने के लिए हो, तो क्यों नहीं? – Raphael

+1

'Iterable' (जिसमें मानचित्र और सेट शामिल हैं) उस ऑर्डर की गारंटी नहीं देता है जिसमें तत्वों का दौरा किया जाएगा। एक बेहतर सवाल यह पूछेगा कि 'SEP' की बजाय' Iterable' पर 'zipWithIndex' क्यों परिभाषित किया गया है। –

+0

इस चर्चा के बाद, ऐसा लगता है कि foreach या तो ट्रैवर्सबल (क्यों नहीं) या Seq (guarenteed आदेश) पर अधिक समझ में आता है! – schmmd

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