2012-01-20 5 views
9

Ho scritto un tratto per l'ordinamento di iterabili in Scala, e ci è voluto quasi tutto il tempo per creare una classe con cui avrei potuto mescolarlo con il tempo necessario per scrivere il tratto. Perché la decisione di progettazione è stato fatto per non consentire agli utenti di cose come la scrittura:Perché tutte le collezioni immutabili di base sono finali o sigillate in scala?

new List[Int] with SuperAwesomeTrait[Int]? 

Ora, se io voglio fare questo, ho bisogno di fare un po 'strano fare altre cose come,

class StupidList extends LinearSeq { 
    val inner = List() 
    /* reimplement list methods by calling into inner */ 
} 

e poi

new StupidList[Int] with SuperAwesomeTrait[Int]. 

risposta

9

Perché se scrivo

someList match { 
    case Cons(head, tail) => whatever 
    case Nil => somethingElse 
} 

Non voglio che la mia logica venga interrotta da una nuova sottoclasse inaspettata.

Ho il sospetto che tu stia cercando di risolvere un problema utilizzando la sottoclasse che sarebbe stata meglio risolta con impliciti.

+0

Tuttavia la stessa pratica mi porterebbe a lanciare l'immutabile fuori dallo stdlib con una forza quasi infinita. Contro, tuttavia restituisce una nuova lista in modo da non essere rotto. – Joshua

+0

Perché questo è un problema per 'List' più che per qualsiasi altra classe? –

+2

@Joshua, non ho idea di cosa tu stia parlando. Uso la corrispondenza dei modelli per decostruire qualcosa. Non sto creando nulla. –