2013-10-18 11 views
6

これは正常ですか?Scala 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 "特に指定しない限り、イテレータを使用してイテレータを使用するべきではないことに注意することは特に重要です。最も重要な例外は唯一の抽象メソッドでもあります:nextとhasNextです。 –

答えて

18

ありません、それはバグではありません。それは正常な動作です。

イテレータは変更可能なものです。それらをポインタと考えることができます。イテレータを要求するたびに、それを指す次の要素を渡すと、それはさらに1つの位置に移動します。

あなたはそれを右に毎回一つの位置を移動し、それが指すシーケンスの各要素を横断しますあなたのサイズを与えるためにそれを頼みます。 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)は空です。彼らは非常に壊れやすいデータ構造であるため、

イテレータは、注意して使用することがあります。

関連する問題