2011-11-28 11 views
7

पर इटेटरेटर का अप्रत्याशित व्यवहार कोई भी समझा सकता है कि ये इटरेटर अलग-अलग व्यवहार क्यों करते हैं? मैं आम तौर पर एक स्ट्रिंग को IndexedSeq[Char] की तरह कार्य करने की अपेक्षा करता हूं। क्या यह कहीं भी दस्तावेज है?स्ट्रिंग

val si: Iterator[Char] = "uvwxyz".iterator 
val vi: Iterator[Char] = "uvwxyz".toIndexedSeq.iterator 

val sr = for (i <- 1 to 3) 
      yield si take 2 mkString 
    //sr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, uv, uv) 

val vr = for (i <- 1 to 3) 
      yield vi take 2 mkString 
    //vr: scala.collection.immutable.IndexedSeq[String] = Vector(uv, wx, yz) 
+0

पहले उदाहरण में '.take (2) 'जैसा लगता है यह इटरेटर की एक प्रति बनाता है। – ziggystar

उत्तर

7

इस पर take को आमंत्रित करने के बाद पुनरावर्तक की स्थिति के बारे में कोई गारंटी नहीं है।

इटरेटर के साथ समस्या यह है कि कई उपयोगी संचालन केवल साइड इफेक्ट्स के कारण लागू किए जा सकते हैं। इन सभी परिचालनों का एक प्रत्यक्ष प्रत्यक्ष प्रभाव होता है लेकिन उनके दुष्प्रभाव भी हो सकते हैं जिन्हें निर्दिष्ट नहीं किया जा सकता है (या कार्यान्वयन को जटिल करेगा)।

take के मामले में ऐसे कार्यान्वयन हैं जो इटरेटर की आंतरिक स्थिति को क्लोन करते हैं और अन्य जो इटरेटर को आगे बढ़ाते हैं। यदि आप साइड इफेक्ट्स की अनुपस्थिति की गारंटी देना चाहते हैं तो आपको किसी भी अन्य मामले में अपरिवर्तनीय डेटा संरचनाओं का उपयोग करना होगा, आपके कोड को केवल प्रत्यक्ष प्रभावों पर भरोसा करना चाहिए।

+0

हम्म, मुझे आश्चर्य है कि 'इटरेटर' के लिए कुछ महत्वपूर्ण क्यों महत्वपूर्ण है? –

+0

मैंने समस्या को बेहतर तरीके से हाइलाइट करने के लिए उत्तर अपडेट किया। – Moritz

+2

@ लुइगीप्लिंग, http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/index.html#scala.collection.Iterator पर ट्रंक में कुछ सुधार हुए थे: " सुरक्षित और असुरक्षित उपयोग के लिए इस उदाहरण पर विचार करें "। – huynhjl

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