Ich habe mir diese Frage angesehen , verstehe aber immer noch nicht den Unterschied zwischen iterierbaren und traversierbaren Merkmalen. Kann jemand erklären?
scala
scala-collections
Rahul
quelle
quelle
Traversable
in Scala 2,13 (es immer noch als deprecated alias für gehalten wird ,Iterable
bis 2.14)Antworten:
Einfach ausgedrückt, Iteratoren behalten den Status bei, Traversables nicht.
A
Traversable
hat eine abstrakte Methode :foreach
. Wenn Sie aufrufenforeach
, füttert die Sammlung die übergebene Funktion nacheinander mit allen Elementen, die sie behält.Auf der anderen Seite hat ein
Iterable
als abstrakte Methodeiterator
, die ein zurückgibtIterator
. Sie können rufennext
auf einIterator
das nächste Element zum Zeitpunkt Ihrer Wahl zu bekommen. Bis Sie dies tun, muss es verfolgen, wo es in der Sammlung war und was als nächstes kommt.quelle
Iterable
erstreckt sichTraversable
, also denke ich, du meinstTraversable
s, die nichtIterable
s sind.Traversable
Schnittstelle erfordert nicht, den Status beizubehalten , während die Einhaltung derIterator
Schnittstelle dies tut.Traversable
s,Iterable
die keinen Iterationsstatus beibehalten. Es ist das, was von demIterator
geschaffen und zurückgegeben wirdIterable
, das den Zustand erhält.Betrachten Sie es als den Unterschied zwischen Blasen und Saugen.
Wenn Sie ein
Traversable
sforeach
oder seine abgeleiteten Methoden aufgerufen haben , werden seine Werte einzeln in Ihre Funktion eingeblendet, sodass es die Kontrolle über die Iteration hat.Mit dem
Iterator
von einem zurückgegebenenIterable
Punkt saugen Sie die Werte heraus und steuern selbst, wann Sie zum nächsten wechseln müssen.quelle
tl; dr
Iterables
sindTraversables
, die Stateful produzieren könnenIterators
Erstens wissen, dass
Iterable
das Subtrait von istTraversable
.Zweite,
Traversable
erfordert die Implementierung derforeach
Methode, die von allem anderen verwendet wird.Iterable
erfordert die Implementierung deriterator
Methode, die von allem anderen verwendet wird.Zum Beispiel die Implementierung von
find
for-Traversable
Verwendungenforeach
(über ein zum Verständnis) und löst eineBreakControl
Ausnahme aus, um die Iteration anzuhalten, sobald ein zufriedenstellendes Element gefunden wurde.Im Gegensatz dazu
Iterable
überschreibt die Subtraktion diese Implementierung und ruft diefind
aufIterator
, die einfach aufhört zu iterieren, sobald das Element gefunden wurde:Es wäre schön, keine Ausnahmen für die
Traversable
Iteration auszulösen, aber dies ist die einzige Möglichkeit, teilweise zu iterieren, wenn nur verwendet wirdforeach
.Aus einer Perspektive,
Iterable
ist die anspruchsvolleren / mächtig Zug, wie Sie leicht umsetzen könnenforeach
mititerator
, aber man kann nicht wirklich implementiereniterator
verwendenforeach
.Zusammenfassend
Iterable
bietet es eine Möglichkeit, die Iteration über einen Stateful anzuhalten, fortzusetzen oder zu stoppenIterator
. MitTraversable
ist es alles oder nichts (ohne Ausnahmen für die Flusskontrolle).Meistens spielt es keine Rolle, und Sie möchten die allgemeinere Benutzeroberfläche. Wenn Sie jedoch jemals eine individuellere Kontrolle über die Iteration benötigen
Iterator
, benötigen Sie eine , die Sie von einer abrufen könnenIterable
.quelle
Daniels Antwort klingt gut. Lassen Sie mich sehen, ob ich es in meine eigenen Worte fassen kann.
Ein Iterable kann Ihnen also einen Iterator geben, mit dem Sie die Elemente einzeln (mit next ()) durchlaufen und anhalten und loslegen können, wie Sie möchten. Dazu muss der Iterator einen internen "Zeiger" auf die Position des Elements halten. Ein Traversable bietet Ihnen jedoch die Möglichkeit, alle Elemente gleichzeitig zu durchlaufen, ohne anzuhalten.
So etwas wie Range (1, 10) muss nur 2 Ganzzahlen als Status eines Traversable haben. Mit Range (1, 10) als Iterable erhalten Sie jedoch einen Iterator, der 3 Ganzzahlen für den Status verwenden muss, von denen eine ein Index ist.
In Anbetracht dessen, dass Traversable auch foldLeft und foldRight bietet, muss foreach die Elemente in einer bekannten und festen Reihenfolge durchlaufen. Daher ist es möglich, einen Iterator für ein Traversable zu implementieren. ZB def iterator = toList.iterator
quelle