2012-03-23 9 views

risposta

14

Normalmente si dovrebbe essere più interessato con l'interfaccia che la raccolta implementa piuttosto che il suo tipo concreto, vale a dire si dovrebbe pensare in termini di Seq, LinearSeq, e IndexedSeq piuttosto che List, Array, e Vector, che sono implementazioni concrete. Quindi probabilmente non ci dovrebbero essere toList e toArray, ma immagino che siano lì perché sono così fondamentali.

Il metodo toIndexedSeq fornisce in pratica un Vector, a meno che una raccolta non lo sostituisca per fornire un'implementazione più efficiente. Puoi anche creare un vettore con Vector() ++ c dove c è la tua raccolta.

+0

Quindi è una buona pratica per impostare tutto tipi di parametri di funzione a Iterable invece di tipi specifici (a meno che non siano necessari per alcune funzionalità/prestazioni specifiche)? – sdkfasldf

+3

Se ne hai bisogno per coprire tutti gli Iterables, allora fallo con tutti i mezzi, ma il compilatore non si lamenterà quando passi il tuo metodo a Mappa per sbaglio! Penso che in OO in generale, la teoria è che si suppone di accettare che il tipo più generale possibile e restituire il più specifico. Con le raccolte, rendere i tipi accettati troppo generali significherà che anche il tipo restituito sarà molto generale (vedi questa domanda: http://stackoverflow.com/q/8235462/770361). Quindi, in pratica, i metodi che stai usando 'List' ecc.' Seq' è un buon compromesso per usare IMO. –

+4

Penso che ci dovrebbe essere 'toVector' comunque. A volte questa intera cosa del codice all'interfaccia è importante, come ai confini dell'API, ma la maggior parte delle volte si sta solo cercando di portare a termine il lavoro e la mancanza di 'toVector' è solo fastidiosa. 'Vector' è una grande raccolta di carattere generale; gli usi di 'List' e' Array' sono piuttosto specializzati. –

3

Scala 2.10 sarà disponibile con un metodo .to[C[_]] in modo che si può scrivere .to[List], .to[Array], .to[Vector], o qualsiasi altro compatibile C.

+1

E '.to [Seq]' produce un Vettore, almeno per i casi che ho provato. – AmigoNico

+0

@AmigoNico, questo perché 'Seq' è un tratto, non un tipo concreto. – missingfaktor

+1

Sì, scusa, stavo solo facendo notare che Vector è stato scelto in quel caso. – AmigoNico

1

Scala 2.10 aggiunge non solo .to [Vettore], ma .toVector, così:

Nel tratto TraversableOnce ereditata da collezioni e iteratori:

abstract def toVector: Vector[A] 
Problemi correlati