これは正常ですか?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
実際に私は他の奇妙なエラーに会うでしょう。バグはありますか?
これは正常ですか?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
実際に私は他の奇妙なエラーに会うでしょう。バグはありますか?
ありません、それはバグではありません。それは正常な動作です。
イテレータは変更可能なものです。それらをポインタと考えることができます。イテレータを要求するたびに、それを指す次の要素を渡すと、それはさらに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
それは普通のことです。 Iterator
のサイズを調べるには、それが空になるまで繰り返す必要があります。
そしてそれは(サイズ== 0)は空です。彼らは非常に壊れやすいデータ構造であるため、
イテレータは、注意して使用することがあります。
:
size
への新しい呼び出しが行われるとき、それはすぐに何が起こっているかをよりよく理解するために0を返しますので、イテレータは既に、端部に配置されている、あなたはこれを行うことができます/ /www.scala-lang.org/api/current/#scala.collection.Iterator "特に指定しない限り、イテレータを使用してイテレータを使用するべきではないことに注意することは特に重要です。最も重要な例外は唯一の抽象メソッドでもあります:nextとhasNextです。 –