2011-10-27 13 views
7

Metoda toInt w StringLike nie przyjmuje żadnych argumentów i może analizować tylko w systemie dziesiętnym. Aby przetworzyć binarne, heksowe itp., Musimy skorzystać z Javy Integer#parseInt(String s, int radix).Przeciążenie istniejącej metody "toInt"

W próbie naprawienia tego stanu rzeczy, próbowałem następujące

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

Jednak

"101".toInt(2) 

powoduje kompilator rEPL do „katastrofy” spektakularnie i nie działa w skompilowany kod albo.

Czy istnieją pewne ograniczenia dotyczące przeciążania istniejących metod przy użyciu wzorca "wzbogacić moją bibliotekę"?

+1

Czy jesteś pewien, że twój nowy tag, ["szumiące"] (http://en.wikipedia.org/wiki/Pimping), jest odpowiedni? – Blender

+5

+1 za awarię REPL :-). –

+0

@Blender: naprawiono :) – tenshi

Odpowiedz

3

Bez domniemanych uruchomień "101".toInt(2) powoduje, że REPL informuje mnie, że Int nie pobiera parametrów. Więc domyślam się, że to działa "101".toInt, a następnie próbuje wywołać apply(2) na tym, co nie ma sensu. Sugerowałbym subtelną zmianę nazwy twojej sterylizowanej toInt, aby uniknąć problemu.

edit

miałem tylko jakiś sukces własną rękę. I wyraźnie zdefiniował Pimped klasy String jako

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

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

I REPL był zadowolony:

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

Ale wtedy nie można nazwać 'toInt' bez parametru ... –

+4

Wygląda na to, że scala nie chce ułatwiać przeciążania metod przez implicity: zobacz http://stackoverflow.com/questions/4480250/scala-pimp-my- library-with-overloads i http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-imicit -conversions – Dylan

+0

Odpowiedź znajduje się w linkach podanych powyżej, więc akceptując tę –

1

REPL nie powinien upaść - to błąd. Ale przecież przeciążanie nazw jest nieco zniechęcone i nie jest obsługiwane w niektórych kontekstach. Po prostu użyj innej nazwy:

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

scala> "10110" base 2 
res1: Int = 22 
Powiązane problemy