Scala: Quelle est la différence entre Traversable et Itératif traits Scala collections?
J'ai regardé cette question mais ne comprends toujours pas la différence entre Itérable et Traversable traits. Quelqu'un peut m'expliquer ?
- Il n'y a plus
Traversable
dans Scala 2.13 (il est toujours gardé comme obsolète, alias pourIterable
jusqu'à 2.14)
Vous devez vous connecter pour publier un commentaire.
Pour le dire simplement, les itérateurs pour conserver l'état, traversables ne pas.
Un
Traversable
a une méthode abstraite:foreach
. Lorsque vous appelezforeach
, la collection va nourrir le passé de la fonction de tous les éléments qu'il garde, l'un après l'autre.D'autre part, une
Iterable
a comme méthode abstraiteiterator
, qui retourne unIterator
. Vous pouvez appelernext
sur unIterator
pour obtenir l'élément suivant au moment de votre choix. Jusqu'à ce que vous faites, c'est de garder une trace de l'endroit où il a été dans la collection, et quelle est la prochaine.Iterable
s'étendTraversable
, donc je suppose que tu veux direTraversable
s qui ne sont pasIterable
s.Traversable
interface ne nécessite pas de conserver l'état, tout en respectantIterator
interface n'.Traversable
s qui sontIterable
ne pas garder itération de l'état. C'est leIterator
créé et retourné par laIterable
qui maintient l'état.Pense que la différence entre le soufflage et la succion.
Lorsque vous avez un appel en un
Traversable
sforeach
, ou de ses dérivés méthodes, il va souffler ses valeurs dans votre fonction d'un seul à la fois - de sorte qu'il a le contrôle sur l'itération.Avec le
Iterator
retourné par uneIterable
cependant, vous sucer les valeurs en dehors de ça, le contrôle de quand passer à la suivante en vous-même.tl;dr
Iterables
sontTraversables
qui peuvent produire de la dynamiqueIterators
D'abord, sachez que
Iterable
est sous-caractère deTraversable
.Deuxième,
Traversable
nécessite la mise en œuvre de laforeach
méthode, qui est utilisé par tout le reste.Iterable
nécessite la mise en œuvre de laiterator
méthode, qui est utilisé par tout le reste.Par exemple, la mise en œuvre de
find
pourTraversable
utiliseforeach
(via un, pour la compréhension), et elle jette unBreakControl
exception pour arrêter l'itération une fois satisfaisante élément a été trouvé.En revanche, la
Iterable
soustraire les remplacements de cette mise en œuvre et les appelsfind
sur leIterator
, qui s'arrête tout simplement de l'itération, une fois l'élément trouvé:Ce serait sympa de ne pas lancer des exceptions pour
Traversable
itération, mais c'est la seule partie itération lors de l'utilisation justeforeach
.D'un point de vue,
Iterable
est le plus exigeant/puissant trait de caractère, que vous pouvez facilement mettre en œuvreforeach
à l'aide deiterator
, mais vous ne pouvez pas vraiment mettre en œuvreiterator
à l'aide deforeach
.En résumé,
Iterable
fournit un moyen pour mettre en pause, reprendre ou arrêter l'itération par l'intermédiaire d'un statefulIterator
. AvecTraversable
, c'est tout ou rien (sans exceptions pour le contrôle de flux).La plupart du temps, il n'a pas d'importance, et vous aurez besoin de la plus générale de l'interface. Mais si vous avez besoin de plus de contrôle personnalisé sur itération, vous aurez besoin d'un
Iterator
, que vous pouvez récupérer à partir d'unIterable
.Daniel en réponse sonne bien. Permettez-moi de voir si je peux le mettre dans mes propres mots.
Donc un objet iterable peut vous donner un itérateur, qui vous permet de parcourir les éléments un à la fois (à l'aide de next()), et d'arrêter et venir comme vous s'il vous plaît. Pour cela, l'itérateur doit garder un "pointeur" interne à l'élément de position. Mais un Traversable vous donne la méthode foreach pour parcourir tous les éléments à la fois sans s'arrêter.
Quelque chose comme Range(1, 10) doit avoir seulement 2 entiers de l'état en tant que Traversable. Mais Range(1, 10) comme un objet iterable vous donne un itérateur qui a besoin d'utiliser les 3 entiers pour l'état, dont l'un est un indice.
Considérant que Traversable propose également foldLeft, foldRight, son foreach doit parcourir les éléments dans une connue et fixe l'ordre. Il est donc possible de mettre en œuvre un itérateur sur un Praticable. E. g.
def iterator = toList.itérateur