2013-10-18 10 views
6

क्या यह सामान्य है?स्कैला 2.10, Iterator.size में बग?

scala> val x = Iterator(List[String]("str")) 
lol: Iterator[List[String]] = non-empty iterator 

scala> x.size 
res1: Int = 1 

scala> x.size 
res2: Int = 0 

और वास्तव में मैं अन्य अजीब त्रुटियों को पूरा कर रहा हूं .. एक संभावित बग?

+3

:/जब size के लिए एक नया कॉल किया जाता है, इटरेटर पहले से ही अंत में स्थिति में है, तो यह तुरंत 0.

लौट बेहतर क्या हो रहा है यह समझने के लिए करेंगे, तो आप ऐसा कर सकते हैं /www.scala-lang.org/api/current/#scala.collection.Iterator "यह ध्यान रखना महत्वपूर्ण है कि, जब तक कि अन्यथा न कहा गया हो, * किसी को इस पर कोई विधि कॉल करने के बाद कभी भी इटरेटर का उपयोग नहीं करना चाहिए। * दोनों सबसे महत्वपूर्ण अपवाद भी एकमात्र अमूर्त विधियां हैं: अगला और अगला अगला। " –

उत्तर

18

नहीं, यह कोई बग नहीं है। यह सामान्य व्यवहार है।

इटरेटर परिवर्तनीय चीजें हैं। आप उन्हें पॉइंटर्स के रूप में सोच सकते हैं। प्रत्येक बार जब आप इसे अगले तत्व देने के लिए एक पुनरावर्तक से पूछते हैं तो यह इंगित करता है कि यह एक स्थिति आगे बढ़ेगा।

जब आप इसे आकार देने के लिए कहते हैं तो यह अनुक्रम में प्रत्येक तत्व को पार करेगा, प्रत्येक बार एक स्थिति को दाईं ओर ले जायेगा। जब iterator.hasNext == false को पार करने के लिए उसके पास कोई और तत्व नहीं है तो यह आकार वापस कर देगा। लेकिन तब तक यह सभी तत्वों को समाप्त कर देगा। से http

val it = Iterator(1, 2, 3, 4) 
//it: >1 2 3 4 
it.next() //ask for the next element 
//it: 1 >2 3 4 
it.next() 
//it: 1 2 >3 4 
println(it.size) // prints 2 
//it: 1 2 3 4 > 
println(it.size) // prints 0 
6

यह सामान्य है। Iterator के आकार का पता लगाने के लिए, आपको इसे खाली होने तक इसे फिर से चालू करना होगा।

और फिर यह खाली है (आकार == 0)।

Iterators का उपयोग देखभाल के साथ किया जाना चाहिए, क्योंकि वे बहुत ही कमजोर डेटा-संरचनाएं हैं।

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