2017-05-11 9 views
2

私は、私は完全には理解していない行動を観察しています: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に含まれなければならない。イテレータb3, (4,5)です。ここで、(4,5)は、全く同じイテレータであるaのままです。私の理解は正しいのですか?

bの動作がaの操作を適用することによって変更されていることを考えると、上記のことを考えるとかなり危険です。基本的に同じ場所を指す2つのオブジェクトがあります。 dropWhileはこの悪いスタイルのようですか? documentation for Iteratorから

答えて

1

これは、特に断りのない限り、人はそれにメソッドを呼び出した後、イテレータを使用してはならない、ということに注意することが特に重要です。最も重要な2つの例外は、唯一の抽象メソッドでもあり、nexthasNextです。

あなたはnexthasNext以外のイテレータの任意の方法を、と呼ばれた後、基本的に、あなたはそれが破壊さを検討し、それを処分する必要があります。

+0

。私はなぜ言語がそれ自体を強制しないのだろうと思う。 – Akavall

+1

言語では、値を1回しか使用できないと言う方法はありません。これは、型システムがアファインでないためです(https://en.wikipedia.org/wiki/Substructural_type_systemを参照)。 –

0

この悪いスタイルのようなものはdropWhileですか?

:-)はい

理にかなって
+0

'dropWhile'は悪いスタイルではありません。 その後、元のイテレータを使用していますが、それが問題です。 – Dima

+0

あなたが正しいです、それは問題の 'dropWhile'ではありません。 – halversonp

関連する問題