8

これは正常ですか?

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

そして実際に私は他の奇妙なエラーに遭遇しています..バグの可能性はありますか?

4

2 に答える 2

24

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

イテレータは変更可能なものです。それらはポインターと考えることができます。イテレータに、それが指している次の要素を与えるように要求するたびに、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
于 2013-10-18T20:11:54.583 に答える