2011-10-27 16 views
7

El método toInt en StringLike no toma ningún argumento, y solo puede analizarse en decimales. Entonces, para analizar binario, hexadecimal, etc. necesitamos recurrir a Java Integer#parseInt(String s, int radix).Sobrecarga del método `toInt` existente

En un intento de remediar este estado de cosas, he intentado lo siguiente

implicit def strToToIntable(s: String) = new { 
    def toInt(n: Int) = Integer.parseInt(s, n) 
} 

Sin embargo,

"101".toInt(2) 

hace que el compilador REPL al "desplome espectacular" y no funciona en el compilado código tampoco.

¿Hay alguna restricción sobre la sobrecarga de los métodos existentes utilizando el patrón "enriquecer mi biblioteca"?

+1

¿Está seguro de que su nueva etiqueta, ["proxeneta"] (http://en.wikipedia.org/wiki/Pimping), es apropiada? – Blender

+5

+1 por falla REPL :-). –

+0

@Blender: corregido :) – tenshi

Respuesta

3

Sin el implícito, ejecutar "101".toInt(2) hace que REPL me diga que Int no toma los parámetros. Así que supongo que lo que está sucediendo es que está ejecutando "101".toInt, y luego intenta llamar al apply(2) sobre eso, lo cual no tiene sentido. Sugeriría un cambio de nombre sutil de su pimped toInt para evitar el problema.

edición

que acaba de tener un cierto éxito de la mía. He definido explícitamente una clase string pimped como

class StrToRadixInt(s:String) { 
    def toInt(radix: Int) = Integer.parseInt(s,radix) 
} 

implicit def strToToIntable(s:String) = new StrToRadixInt(s) 

Y REPL estaba feliz:

scala> "101".toInt(2) 
res4: Int = 5 
+1

Pero luego no puede llamar a 'toInt' sin el parámetro ... –

+4

Parece que scala no quiere facilitar los métodos de sobrecarga a través de implicits: vea http://stackoverflow.com/questions/4480250/scala-pimp-my- biblioteca-con-sobrecargas y http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-implicit-conversions – Dylan

+0

La respuesta está en los enlaces proporcionados anteriormente, por lo que acepta este –

1

de la réplica no debe fallar - que es un error. Pero aun así, la sobrecarga de nombres se desaconseja un tanto y tampoco se admite en algunos contextos. Simplemente use un nombre diferente:

implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) } 

scala> "10110" base 2 
res1: Int = 22