2016-06-30 12 views
0

Es gibt Probleme beim Konvertieren einer Liste in einen Iterator mit integrierten Methoden.Scala: List.iterator erzeugt leeren Iterator

  1. Der Aufruf iterator.hasNext ändert den Wert von iterator.size.
  2. iterator.hasNext == false selbst bei einem nicht leeren Iterator vor ist eine Iteration aufgetreten.

Irgendwelche Ideen, was diese Probleme verursachen könnte?

val list = scala.collection.immutable.List(1, 2, 3) 
val iterator = list.iterator 
println(iterator.size) // 3 
println(iterator.hasNext) // false 
println(iterator.size) // 0 

Bestätigt lokal auf Scala Version 2.11.4 (OpenJDK 64-Bit Server VM, Java 1.8.0_72).

Bestätigt auf IdeOne here.

+4

Von der Iterator Docs API: "Es ist besonders wichtig zu beachten, dass, wenn nicht anders angegeben, niemals ein Iterator nach dem Aufruf einer Methode verwendet werden sollte.". Dies beinhaltet die 'size' Methode. – Brian

Antwort

5

Berechnen der Größe eines Iterators verbraucht es, da die Größe nicht gespeichert wird. Ich denke, dass es wie beabsichtigt funktioniert, obwohl die API (d. H. Angebotsgröße für einen Iterator) irreführend ist.

+1

Was meinst du mit "verschlingen"? –

+1

Guter Fang, wollte eine "böse" Version von irreführend ausdrücken. Dachte, dass Ausdrücke ausdrücken, was ich meinte, aber es nicht tut. – uberwach

+1

Ich stimme der "verschlingenden" Wortwahl zu, ich war ein wenig geärgert, als ich diese Eigenart entdeckte (gerade heute). –

Verwandte Themen