2013-10-18 21 views
6

Bu normal midir?Scala 2.10'da hata, 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 

Ve aslında diğer garip hatalarla karşılaşıyorum .. olası bir hata?

+3

http Gönderen://www.scala-lang.org/api/current/#scala.collection.Iterator "Aksi belirtilmedikçe, * bir yöntemin çağrılmasından sonra asla bir yineleyici kullanmaması gerektiğini belirtmek özellikle önemlidir." en önemli istisnalar da tek soyut yöntemler: sonraki ve hasNext. " –

cevap

18

Hayır, bir hata değil. Bu normal davranış.

Yineleyiciler değişebilir şeylerdir. Onları işaretçi olarak düşünebilirsiniz. Bir yineleyiciden size bir sonraki öğeyi vermesini istediğinde, bir nokta daha ileriye hareket eder.

Size boyut vermesini istediğinde, her öğeyi işaret ettiği sırayla, her seferinde bir konum sağa hareket ettirerek geçirir. iterator.hasNext == false öğelerini taşımak için daha fazla öğeye sahip olmadığında, boyutu döndürür. Ama o zaman bütün unsurları tüketmiş olacak. size için yeni bir arama yapıldığında, yineleyici zaten sonunda konumlandırılmış, bu yüzden hemen daha iyi neler olduğunu anlamaya için 0

dönecektir, bunu yapabilirsiniz:

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

Normaldir. Bir Iterator boyutunu bulmak için, boş olana kadar devam etmelisiniz.

Ve sonra boş (boyut == 0).

Yineleyiciler çok hassas veri yapıları oldukları için dikkatli bir şekilde kullanılmalıdır.