tutorial software fungicida examples blanquerna scala

scala - software - ¿Cuál es la diferencia entre un "rasgo" y un "rasgo de la plantilla"?



scala vs java (3)

Las clases [...] similares son clases de implementación para las clases de colección reales. En cierto sentido, actúan como implementaciones de plantilla de las cuales las clases de colección reales heredan la mayoría de los comportamientos, si no todos.

Para una descripción muy detallada y accesible, lea La arquitectura de las colecciones de Scala .

Mirando el scaladoc para Traversable y Traversable Like, me está costando entender cuál es la diferencia entre ellos (excepto que uno se extiende al otro). La única diferencia aparente en la documentación es que dice que Traversable es un "rasgo" y TraversableLike es un "rasgo de plantilla". Pero buscar en Google "rasgo de la plantilla" no revela una definición para este término. ¡Ayuda!


Los rasgos XXXLike tienen un papel importante al agregar el parámetro genérico Repr. Los métodos que deben devolver el mismo tipo de colección, como filter, map, flatMap, se implementan en rasgos de bajo nivel (TraversableLike). Para codificar su tipo de retorno, esos rasgos lo reciben:

trait TraversableLike[+A, +Repr] ... ... def filter(p: A => Boolean): Repr = {

(para map y flatMap el problema es más complicado, no lo veré aquí)

Ahora digamos que tienes un nuevo tipo de colección. Podrías hacerlo:

trait MyCollection[+A] extends TraversableLike[A, MyCollection]

Pero luego, si alguien quiere ampliar su colección, se quedan atascados con los valores de retorno de MyCollection de los diversos métodos heredados.

Así que en cambio, creas:

trait MyCollectionLike[+A, +Repr] extends TraversableLike[A, Repr]

y

trait MyCollection[+A] extends MyCollectionLike[A, MyCollection]

y cualquier persona que quiera ampliar su colección extiende MyCollectionLike


No he visto esta terminología de uso general en Scala, y creo que es específica para el diseño de la API de colecciones de Scala. Puede aprender más leyendo la Arquitectura de las colecciones de Scala (especialmente la sección sobre "factorización de operaciones comunes") [1] y el SID de las colecciones de Scala . La sección 4.2 de la SID es relevante, aunque se les conoce como "rasgos de implementación" allí:

Las clases de colección, como Traversable o Vector, heredan todas sus implementaciones de métodos concretos de un rasgo de implementación. Estos rasgos se nombran con el sufijo Me gusta; por ejemplo, VectorLike es el rasgo de implementación para Vector y TraversableLike es el rasgo de implementación para Traversable.

En resumen, su propósito es separar la implementación para su uso fuera de la jerarquía de colecciones (por ejemplo, StringOps extiende TraversableLike pero no Traversable ) y factorizar las operaciones comunes de tal manera que se conserve el tipo de colección (consulte la respuesta de IttayD para una explicación más completa) ).

Debo tener en cuenta que realmente no necesita preocuparse por estas clases a menos que esté extendiendo la jerarquía de colecciones. Para uso ordinario, enfóquese en los rasgos Traversable , Iterable , Seq , etc. Si es nuevo en la API de colecciones de Scala, sugeriría comenzar con el documento de la API de colección de Scala 2.8 , luego haga referencia al scaladoc según sea necesario. No puedes esperar ver el ''panorama general'' mirando a través del scaladoc.

[1] crédito es para michid por este enlace