2012-08-13 19 views
13

pensé que esto sería el uso correcto de las nuevas clases implícitas de Scala 2.10:Cómo utilizar Scala 2.10 clases implícitas

implicit case class IntOps(i: Int) extends AnyVal { 
    def twice = i * 2 
} 

11.twice 
Al parecer no

:

<console>:13: error: value twice is not a member of Int 
       11.twice 
       ^

Me estoy perdiendo algo (Scala 2.10 .0-M6)?

+3

Esto es un error. Abrí [SI-6227] (https://issues.scala-lang.org/browse/SI-6227), aunque no me sorprendería descubrir que es un duplicado. –

+0

una 'clase implícita' no puede ser una 'clase de caso', esa es la única razón. – Valerin

Respuesta

21

Una pista es la desugaring de clases implícitas, se explica en the SIP-13:

implicit class RichInt(n: Int) extends Ordered[Int] { 
def min(m: Int): Int = if (n <= m) n else m 
... 
} 

serán transformados por el compilador de la siguiente manera:

class RichInt(n: Int) extends Ordered[Int] { 
def min(m: Int): Int = if (n <= m) n else m 
... 
} 
implicit final def RichInt(n: Int): RichInt = new RichInt(n) 

Como puede ver, la función implícita que se crea tiene el mismo nombre que las clases originales. Supongo que se hace así para facilitar la importación de clases implícitas.

Así, en su caso, cuando se crea una clase implícita caso, hay un conflicto entre el nombre del método creado por el implicit palabra clave y el objeto acompañante creado por la palabra clave case.

+0

Ok, eso tiene sentido, gracias –

+0

Para mí, esto se parece más a un error. 'case' crea un método' apply', implícito un método con el nombre de la clase. – soc

+0

@Nicolas lo siento por preguntar después de más de 3 años. Pero agradecería si puede mostrar cómo obtener el código desagrupado. Gracias – Polymerase

2

Esto muestra que hay una ambigüedad:

val ops: IntOps = 11 

<console>:11: error: ambiguous reference to overloaded definition, 
both method IntOps of type (i: Int)IntOps 
and object IntOps of type IntOps.type 
match argument types (Int) and expected result type IntOps 
     val ops: IntOps = 11 
         ^

No está seguro de lo que sucede exactamente. Pero cuando no se utiliza un case class parece bien:

implicit class IntOps(val i: Int) extends AnyVal { 
    def twice = i * 2 
} 

11.twice // ok 
Cuestiones relacionadas