2012-02-13 20 views
10

he el siguiente código para imprimir los números del 1 al 9 en las cartasvuelve alcance Scala largo en lugar de Int

class IntToNumber(num:Int) { 
    val digits = Map("1" -> "one", "2" -> "two", "3" -> "three", "4" -> "four", "5" -> "five", "6" -> "six", "7" -> "seven", "8" -> "eight", "9" -> "nine") 
    def inLetters():String = { 
     digits.getOrElse(num.toString,"") 
    } 
} 

implicit def intWrapper(num:Int) = new IntToNumber(num) 
(1 until 10).foreach(n => println(n.inLetters)) 

Cuando ejecuto el código me sale un error diciendo que el método no está disponible para Long

Script.scala:9: error: value inLetters is not a member of Long 
(1 until 10).foreach(n => println(n.inLetters)) 
            ^
one error found 

Cambio de la última línea para

(1 until 10).foreach(n => println(n.toInt.inLetters)) 

funciona bien ..

¿Alguien puede ayudarme a entender por qué ese rango (de 1 a 10) regresa largo y no int?

+0

Puzzling. '(1 a 10): IndexedSeq [Int]' dice que la expresión tiene el tipo 'NumericRange.Exclusive [Long]' y por lo tanto la adscripción no es válida. '(1 a 10): IndexedSeq [Long]' funciona. – missingfaktor

+0

Parece un error. Ejecutar '(1 hasta 2) foreach (x => println (x.getClass))' no da resultados consistentes. Algunas veces imprime 'int', otras veces imprime' long'. – missingfaktor

+0

Oh, parece que @ziggystar resolvió el misterio. :-) – missingfaktor

Respuesta

14

He cambiado el nombre de su conversión implícita a intWrapperX. La siguiente sesión muestra el ejemplo fijo.

El problema es que sus sombras intWrapperscala.Predef.intWrapper(i:Int): RichInt que se necesita para crear el objeto Range. Dejo la explicación de por qué la conversión a Long (o presumible RichLong) les llega a los comentaristas.

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class IntToNumber(num:Int) { 
    val digits = Map("1" -> "one", "2" -> "two", "3" -> "three", "4" -> "four", "5" -> "five", "6" -> "six", "7" -> "seven", "8" -> "eight", "9" -> "nine") 
    def inLetters():String = { 
     digits.getOrElse(num.toString,"") 
    } 
} 

implicit def intWrapperX(num:Int) = new IntToNumber(num)  

// Exiting paste mode, now interpreting. 

defined class IntToNumber 
intWrapperX: (num: Int)IntToNumber 

scala> (1 until 10).foreach(n => println(n.inLetters)) 
one 
two 
three 
... 
+0

+1, explicación fantástica. –

+0

Ojalá ASÍ me hubiera hablado de su respuesta antes. Me permitió pasar 13 minutos averiguandome por mí mismo, y luego, a medio escribir mi respuesta, me contó sobre esto :( – Dylan

+2

¡Muchas gracias! También aprendí el modo: pegar, muy útil – mericano1

Cuestiones relacionadas