これは正常ですか?
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 つ先の位置に移動します。
サイズを指定するように要求すると、それが指すシーケンス内の各要素をトラバースし、毎回 1 つの位置を右に移動します。トラバースする要素がなくなるiterator.hasNext == false
と、サイズが返されます。しかし、それまでにすべての要素を使い果たします。への新しい呼び出しsize
が行われると、イテレータはすでに最後に配置されているため、すぐに 0 を返します。
何が起こっているのかをよりよく理解するには、次のようにします。
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