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?
das Sinn macht. Ich frage mich, warum die Sprache es nicht selbst durchsetzt. – Akavall
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). –