चेतावनी: स्काला 2.9.0 के रूप में, कम से कम, इस मूल इटरेटर खाली हो जाती है। आप दो प्रतियां प्राप्त करने के लिएval ls = it.toList; val it1 = ls.iterator; val it2 = ls.iterator
कर सकते हैं। या डुप्लिकेट का उपयोग करें (जो गैर-सूचियों के लिए भी काम करता है)।
रेक्स के जवाब किताब से है, लेकिन वास्तव में अपने मूल समाधान अब तक scala.collection.immutable.List के लिए सबसे कुशल कर रहा है।
सूची इटरेटर्स को उस तंत्र का उपयोग करके डुप्लिकेट किया जा सकता है, अनिवार्य रूप से कोई ओवरहेड नहीं। यह scala.collection.immutable.LinearSeq, esp में iterator() के कार्यान्वयन की त्वरित समीक्षा द्वारा पुष्टि की जा सकती है। टूलीस्ट विधि की परिभाषा, जो बैकिंग सेक के _.Listist को वापस लौटाती है, यदि यह एक सूची है (जैसा कि यह आपके मामले में है) पहचान है।
मुझे आपके प्रश्न की जांच करने से पहले सूची इटरेटर्स की इस संपत्ति से अवगत नहीं था, और मैं जानकारी के लिए बहुत आभारी हूं ... अन्य चीजों के साथ इसका मतलब है कि कई "सूची कंकड़" एल्गोरिदम को स्कैला पर कुशलतापूर्वक कार्यान्वित किया जा सकता है अपरिवर्तनीय इटरेटर का उपयोग कंकड़ के रूप में करते हैं।
स्रोत
2011-03-07 18:21:45
क्यों? एक बार जब आप इसे क्लोन कर लेंगे तो मूल इटरेटर का उपभोग किया जाएगा और बेकार होगा, इस प्रकार पहले क्लोन के पूरे बिंदु को हराया जाएगा ... –
@ केविन, यह निश्चित रूप से मामला नहीं है, निश्चित रूप से? जाहिर है, ऐसा लगता है कि एक ऐसा ऑपरेशन हो सकता है जो मुझे एक इटरेटर प्रदान करता है जो स्रोत अनुक्रमक के समान अनुक्रम लौटाएगा - बेशक, राज्य के मुद्दे सभी इटरेटर के लिए असंभव बना सकते हैं। ऐसा लगता है कि मूल रूप से स्रोत को उपभोग करने की आवश्यकता नहीं है। –
'val' से' def' तक स्विच करने से आपको हर बार प्रतीक का संदर्भ देने के लिए एक नया इटरेटर मिल जाएगा (उपरोक्त उदाहरण में 'it' नाम दिया गया है)। कई मामलों में इस तरह से आसान लग सकता है। – matanster