2017-05-11 4 views
2

ich beobachtet habe, ein Verhalten, das ich nicht vollständig verstehen:dropWhile erstellt zwei Iteratoren mit demselben zugrunde liegenden Iterator?

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 

Es sieht aus wie: Iterator Teil (1,2,3) von Iterator a verbraucht wird, und (4,5) gelassen wird. Da 3 ausgewertet werden musste, musste es konsumiert werden, aber per Definition dropWhile muss in b aufgenommen werden. Iterator b ist 3, (4,5) wobei (4,5) was immer noch von a übrig ist, der genau gleiche Iterator. Ist mein Verständnis richtig?

Angesichts der obigen sieht es ziemlich gefährlich aus, dass das Verhalten von b durch die Anwendung von Operationen auf a geändert wird. Grundsätzlich haben wir zwei Objekte, die auf denselben Ort zeigen. Verwendet dropWhile wie dieser schlechte Stil?

Antwort

1

Vom documentation for Iterator:

Es ist von besonderer Bedeutung, zu beachten, dass, wenn nicht anders angegeben, soll man nie einen Iterator verwenden, nachdem ein Verfahren auf sie anrufen. Die zwei wichtigsten Ausnahmen sind auch die einzigen abstrakten Methoden: next und hasNext.

Grundsätzlich, wenn Sie jede Methode auf einem Iterator, andere als next und hasNext genannt, sollten Sie es zerstört, und entsorgen.

+0

das Sinn macht. Ich frage mich, warum die Sprache es nicht selbst durchsetzt. – Akavall

+1

Die Sprache hat keine Möglichkeit zu sagen, dass ein Wert nur einmal verwendet werden kann. Dies liegt daran, dass das Typsystem nicht affin ist (siehe https://en.wikipedia.org/wiki/Substructural_type_system). –

0

Verwendet dropWhile wie dieser schlechte Stil?

ja :-)

+0

Die Verwendung von 'DropWhile' ist überhaupt kein schlechter Stil. Es ist der ursprüngliche Iterator danach, das ist das Problem. – Dima

+0

Sie haben Recht, es ist nicht das "DropWhile", das ist das Problem. – halversonp

Verwandte Themen