2012-03-23 10 views

Respuesta

14

Normalmente debería estar más preocupado con la interfaz que la colección implementa en lugar de su tipo inmediato, es decir, usted debe pensar en términos de Seq, LinearSeq, y IndexedSeq en lugar de List, Array y Vector, que son implementaciones concretas. Así que podría decirse que no debería haber toList y toArray tampoco, pero supongo que están ahí porque son fundamentales.

El método toIndexedSeq en la práctica le proporciona un Vector, a menos que una colección anule esto para proporcionar una implementación más eficiente. También puede hacer un Vector con Vector() ++ c donde c es su colección.

+0

lo que es una buena práctica para establecer todas tipos de parámetros de funciones a Iterable en lugar de tipos específicos (a menos que los necesite para alguna funcionalidad/rendimiento específico)? – sdkfasldf

+3

Si lo necesitas para cubrir todos los Iterables, hazlo, pero el compilador no se quejará cuando pases tu mapa por error. Creo que en OO en general, la teoría es que se supone que debes aceptar ese tipo más general posible y devolver el más específico. Con las colecciones, hacer que los tipos aceptados sean demasiado generales significará que el tipo devuelto también será muy general (consulte esta pregunta: http://stackoverflow.com/q/8235462/770361). Entonces, en la práctica, los métodos que toman 'List', etc.' Seq' son un buen compromiso para usar IMO. –

+4

Creo que debería haber 'toVector' de todos modos. A veces, todo este asunto del código a la interfaz es importante, como en los límites de API, pero la mayoría de las veces solo intentas hacer el trabajo y la falta de 'toVector' es simplemente molesta. 'Vector' es una gran colección de propósito general; los usos de 'List' y' Array' son bastante especializados. –

3

Scala 2,10 vendrá con un método .to[C[_]] por lo que se puede escribir .to[List], .to[Array], .to[Vector], o cualquier otro compatible C.

+1

Y '.to [Seq]' produce un Vector, al menos para los casos que probé. – AmigoNico

+0

@AmigoNico, eso es porque 'Seq' es un rasgo, no un tipo concreto. – missingfaktor

+1

Sí, lo siento, solo estaba señalando que se eligió Vector en ese caso. – AmigoNico

1

Scala 2.10 agrega no sólo .para [Vector], pero .toVector, así:

En TraversableOnce rasgo heredado por las colecciones y los iteradores:

abstract def toVector: Vector[A] 
Cuestiones relacionadas