2011-05-14 12 views
7

Sé que el son algunos cambios previstos con respecto a las clases de casos, como no permitir la herencia entre ellos:¿Qué cosas de las clases de casos se eliminarán después de Scala 2.9 exactamente?

scala> case class Foo() 
defined class Foo 

scala> case class Bar() extends Foo() 
<console>:9: warning: case class `class Bar' has case ancestor `class Foo'. Case-to-case inheritance has potentially dangerous bugs which are unlikely to be fixed. You are strongly encouraged to instead use extractors to pattern match on non-leaf nodes. 
     case class Bar() extends Foo() 
       ^
defined class Bar 

o casos de clases sin lista de parámetros (no estoy seguro de eso):

scala> case class Foo 
<console>:1: warning: case classes without a parameter list have been deprecated; 
use either case objects or case classes with `()' as parameter list. 
     case class Foo 
        ^
<console>:7: warning: case classes without a parameter list have been deprecated; 
use either case objects or case classes with `()' as parameter list. 
     case class Foo 
        ^
defined class Foo 

qué más está actualmente @deprecated?

+6

La razón por la cual las clases de casos sin listas de parámetros son "mal" es porque llevan ningún estado que sería diferente de un caso a otro, ya que no tienen campos (por lo al menos ninguno que se establezca a través de argumentos de constructor, que es la única forma en que debería hacerse ...), por lo que realmente deberían ser objetos de caso, ya que una sola instancia puede representar todos los "estados" posibles. –

+5

@Dean Wampler: ¿Cómo son las clases de casos con una lista de parámetros vacía '()' diferente? – kassens

+3

¿Por qué es hedionda la herencia entre clases de casos? – djondal

Respuesta

8

Cada clase en Scala debe tener al menos una sección de parámetros no implícita. Si no incluye uno, el compilador lo agregará por usted.

scala> class X 
defined class X 

scala> new X() 
res4: X = [email protected] 

scala> class Y 
defined class Y 

scala> new Y() 
res5: Y = [email protected] 

Las clases de casos no son una excepción. Pero la interacción con la coincidencia de patrones es una fuente de confusión y errores, lo que motiva la desaprobación.

scala> case class A 
<console>:1: warning: case classes without a parameter list have been deprecated; 
use either case objects or case classes with `()' as parameter list. 
     case class A 
       ^
defined class A 

scala> val a = A() 
a: A = A() 

scala> (a: Any) match { case A => 1; case _ => 2 } 
res0: Int = 2 

scala> val companion = A 
companion: A.type = A 

scala> (companion: Any) match { case A => 1; case _ => 2 } 
res0: Int = 1 

Como Dean sugiere, generalmente es mejor modelar esto con un objeto de caja.

No conozco una línea de tiempo para eliminar la compatibilidad con las clases de casos de la lista vacía-param. La herencia de clase de caso casi se eliminó en 2.9.0, pero se ha pospuesto hasta la próxima versión principal.

Lectura adicional:

Why can't the first parameter list of a class be implicit?

Cuestiones relacionadas