2011-10-27 5 views
7

Il metodo toInt in StringLike non accetta argomenti e può solo analizzare in decimale. Quindi per analizzare binari, hex, ecc., Dobbiamo ricorrere a Java Integer#parseInt(String s, int radix).Sovraccarico del metodo `toInt` esistente

Nel tentativo di porre rimedio a questo stato di cose, ho provato la seguente

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

Tuttavia,

"101".toInt(2) 

fa sì che il compilatore REPL al "crash spettacolare" e non funziona in compilato codice

Esiste qualche restrizione sul sovraccarico dei metodi esistenti utilizzando lo schema "arricchisci la mia libreria"?

+1

Sei sicuro che il tuo nuovo tag, ["pimping"] (http://en.wikipedia.org/wiki/Pimping), è appropriato? – Blender

+5

+1 per il crash REPL :-). –

+0

@Blender: risolto :) – tenshi

risposta

3

Senza l'implicito, l'esecuzione di "101".toInt(2) causa REPL per comunicarmi che Int non accetta parametri. Quindi immagino che quello che sta succedendo sia che sia in esecuzione "101".toInt, quindi provo a chiamare apply(2) su quello, il che non ha senso. Suggerirei di rinominare leggermente il tuo pimpato toInt per evitare il problema.

modificare

Ho appena avuto un certo successo del mio. Ho esplicitamente definito una classe string pimped come

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

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

E REPL ero felice:

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

Ma non si può chiamare 'toInt' senza parametro ... –

+4

Sembra che scala non voglia facilitare i metodi di overloading tramite impliciti: consultare http://stackoverflow.com/questions/4480250/scala-pimp-my- library-with-overloads e http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-implicit-conversions – Dylan

+0

La risposta è nei link forniti sopra, quindi accettando questo –

1

Il REPL non dovrebbe bloccarsi - che è un bug. Ma anche così, il sovraccarico dei nomi è un po 'scoraggiato e anche non supportato in alcuni contesti. Basta usare un nome diverso:

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

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