私は、私は完全には理解していない行動を観察しています:dropWhileは、同じ根底にあるイテレータを持つ2つのイテレータを作成しますか?
scala> val a = Iterator(1,2,3,4,5)
a: Iterator[Int] = non-empty iterator
scala> val b = a.dropWhile(_ < 3)
b: Iterator[Int] = non-empty iterator
scala> b.next
res9: Int = 3
scala> b.next
res10: Int = 4
scala> a.next
res11: Int = 5
のように見えます:イテレータa
の一部(1,2,3)
が消費され、そして(4,5)
が残っているイテレータを。 3
が評価されなければならないので、それは消費されなければならないが、dropWhile
の定義によってb
に含まれなければならない。イテレータb
は3, (4,5)
です。ここで、(4,5)
は、全く同じイテレータであるa
のままです。私の理解は正しいのですか?
b
の動作がa
の操作を適用することによって変更されていることを考えると、上記のことを考えるとかなり危険です。基本的に同じ場所を指す2つのオブジェクトがあります。 dropWhile
はこの悪いスタイルのようですか? documentation for Iterator
から
。私はなぜ言語がそれ自体を強制しないのだろうと思う。 – Akavall
言語では、値を1回しか使用できないと言う方法はありません。これは、型システムがアファインでないためです(https://en.wikipedia.org/wiki/Substructural_type_systemを参照)。 –