He mirado esta pregunta pero todavía no entiendo la diferencia entre los rasgos Iterable y Traversable. ¿Alguien puede explicarlo?
scala
scala-collections
Rahul
fuente
fuente

Traversableen Scala 2.13 (todavía se mantiene como un alias obsoletoIterablehasta 2.14)Respuestas:
En pocas palabras, los iteradores mantienen el estado, los transitables no.
Una
Traversabletiene un método abstracto:foreach. Cuando llameforeach, la colección alimentará a la función pasada con todos los elementos que conserva, uno tras otro.Por otro lado, an
Iterabletiene como método abstractoiterator, que devuelve unIterator. Puede llamarnexta unIteratorpara obtener el siguiente elemento en el momento que elija. Hasta que lo haga, debe realizar un seguimiento de dónde estaba en la colección y qué sigue.fuente
IterableextiendeTraversable, así que supongo que te refieres aTraversables que no sonIterables.Traversableinterfaz no requiere mantener el estado, mientras que cumplir con laIteratorinterfaz sí.Traversables queIterableno mantienen ningún estado de iteración. Es loIteratorcreado y devuelto por elIterableque mantiene el estado.Piense en ello como la diferencia entre soplar y chupar.
Cuando haya llamado a
Traversablesforeach, o sus métodos derivados, soplará sus valores en su función uno a la vez, por lo que tiene control sobre la iteración.Con el
Iteratordevuelto por unIterablesin embargo, succiona los valores de él, controlando cuándo pasar al siguiente usted mismo.fuente
tl; dr
IterablessonTraversablesque pueden producir statefulIteratorsPrimero, sepa que
Iterablees un sustrato deTraversable.Segundo,
Traversablerequiere implementar elforeachmétodo, que es utilizado por todo lo demás.Iterablerequiere implementar eliteratormétodo, que es utilizado por todo lo demás.Por ejemplo, la implementación de
findforTraversableusaforeach(vía a para comprensión) y lanza unaBreakControlexcepción para detener la iteración una vez que se ha encontrado un elemento satisfactorio.Por el contrario, la
Iterableresta anula esta implementación y llamafindaIterator, que simplemente deja de iterar una vez que se encuentra el elemento:Sería bueno no lanzar excepciones para la
Traversableiteración, pero esa es la única forma de iterar parcialmente cuando se usa soloforeach.Desde una perspectiva,
Iterablees el rasgo más exigente / poderoso, ya que puede implementar fácilmenteforeachusandoiterator, pero realmente no puede implementariteratorusandoforeach.En resumen,
Iterableproporciona una forma de pausar, reanudar o detener la iteración mediante un statefulIterator. ConTraversable, es todo o nada (sin excepciones para el control de flujo).La mayoría de las veces no importa y querrá una interfaz más general. Pero si alguna vez necesita un control más personalizado sobre la iteración, necesitará un
Iterator, que puede recuperar de unIterable.fuente
La respuesta de Daniel suena bien. Déjame ver si puedo expresarlo con mis propias palabras.
Entonces, un Iterable puede darle un iterador, que le permite atravesar los elementos uno a la vez (usando next ()), y detenerse y avanzar cuando lo desee. Para hacer eso, el iterador necesita mantener un "puntero" interno a la posición del elemento. Pero un Traversable le brinda el método, foreach, para atravesar todos los elementos a la vez sin detenerse.
Algo como Range (1, 10) necesita tener solo 2 enteros como estado como Traversable. Pero Range (1, 10) como Iterable le brinda un iterador que necesita usar 3 enteros para el estado, uno de los cuales es un índice.
Teniendo en cuenta que Traversable también ofrece foldLeft, foldRight, su foreach necesita atravesar los elementos en un orden fijo y conocido. Por lo tanto, es posible implementar un iterador para un Traversable. Por ejemplo, def iterator = toList.iterator
fuente