2012-01-20 23 views
9

Escribí un rasgo para clasificar los iterables en Scala, y me llevó casi el mismo tiempo crear una clase con la que pudiera mezclarla, ya que me llevó a escribir el rasgo. ¿Por qué la decisión de diseño hecho para impedir que los usuarios de escribir cosas como:¿Por qué todas las colecciones base inmutables son definitivas o selladas en scala?

new List[Int] with SuperAwesomeTrait[Int]? 

Ahora si quiero hacer esto, tengo que hacer algún artilugio extraño como,

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

y luego

new StupidList[Int] with SuperAwesomeTrait[Int]. 

Respuesta

9

Porque si escribo

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

No quiero que mi lógica se rompa por una subclase nueva e inesperada.

Sospecho que estás tratando de resolver un problema utilizando subclases que se resolverían mejor con implicits.

+0

Sin embargo, la misma práctica me llevaría a lanzar lo inmóvil de la stdlib con una fuerza casi infinita. Contras, sin embargo, devuelve una nueva lista para que no esté roto. – Joshua

+0

¿Por qué es esto un problema para 'List' más que para cualquier otra clase? –

+2

@Joshua, no tengo idea de lo que estás hablando. Estoy usando la coincidencia de patrones para deconstruir algo. No estoy creando nada. –

Cuestiones relacionadas