5

私は連鎖しようとしていますIterators:

var it = Iterator(1)
it.next
it = Iterator(2) ++ it
it.next
it.hasNext

hasNextここでわかるように、これは無限にループします: https://scastie.scala-lang.org/qbHIVfsFSNO5OYmT4pkutA

これを実行して無限ループ中にスタックを調べると、concetentation でループしています。

        at scala.collection.Iterator$ConcatIterator.merge(Iterator.scala:213)
        at scala.collection.Iterator$ConcatIterator.advance(Iterator.scala:197)
        at scala.collection.Iterator$ConcatIterator.hasNext(Iterator.scala:227)

(このスタックは Scala2.12.11のものですが、Scastie リンクは で同じ動作を示します2.13.2)。

メソッドを呼び出した後にイテレータを使用してはならないことはわかっていますが、これはうまくいくようです。を使用しvarて「現在の」反復子を指し、それを変更して、前の反復子の残りを追加する新しい反復子を指すようにします。

次のわずかな変更は機能します。

var it = Iterator(1)
it.next
val x = it
it = Iterator(2) ++ x
it.next
it.hasNext

スキャスティ リンク: https://scastie.scala-lang.org/1X0jslb8T3WIFLHamspYAg

これは、どういうわけか、壊れたバージョンが自分自身を追加する Iterator を作成していることを示唆しています。ここで何が起こっているかについてのヒントはありますか?

4

1 に答える 1