Overbelasting van de bestaande `toInt`-methode

De methode toInt in StringLike neemt geen argumenten aan en kan alleen in decimalen worden geparseerd. Dus voor het parseren van binaire, hexadecimale enz. Moeten we een beroep doen op Java's Integer # parseInt (String s, int radix) .

In een poging om deze situatie te verhelpen, probeerde ik het volgende

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

Echter,

"101".toInt(2)

zorgt ervoor dat de REPL-compiler "spectaculair crasht" en werkt ook niet in gecompileerde code.

Bestaat er enige beperking voor het overbelasten van bestaande methoden met behulp van het patroon "verrijk mijn bibliotheek"?

7
@tomasz: als ik een upvote kreeg voor elke keer dat ik de REPL crashte, zou ik nu al een reputatie van 100.000 hebben ..
toegevoegd de auteur Kim Stebel, de bron
Weet u zeker dat uw nieuwe tag, "pimping" geschikt is?
toegevoegd de auteur Blender, de bron
Een compilercrash is nooit * het resultaat van slechte code, alleen van slechte compiler. Of, met andere woorden, de bug zit in de compiler. * Nou, er zijn een paar uitzonderingen waar, hoewel de compiler echt niet zou crashen, de code ook niet klopt.
toegevoegd de auteur Daniel C. Sobral, de bron
+1 voor crashen REPL :-).
toegevoegd de auteur Tomasz Nurkiewicz, de bron
@Blender: opgelost :)
toegevoegd de auteur tenshi, de bron

2 antwoord

Zonder de impliciete, lopende "101" .toInt (2) zorgt REPL ervoor dat Int geen parameters opneemt. Dus ik vermoed dat wat er gebeurt is dat het "101" .toInt draait, en dan probeert om call (2) aan te roepen, wat niet logisch is. Ik zou een subtiele hernoeming van uw gepimpte toInt willen voorstellen om het probleem te voorkomen.

bewerken

Ik had alleen wat succes van mezelf. Ik heb expliciet een gepimpte stringklasse gedefinieerd als

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

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

En REPL was blij:

scala> "101".toInt(2)
res4: Int = 5
3
toegevoegd
Het antwoord zit in de links hierboven, dus accepteer deze
toegevoegd de auteur Luigi Plinge, de bron
Het lijkt erop dat scala geen overbelastingsmethoden via implicites wil faciliteren: zie stackoverflow.com/questions/4480250/… en stackoverflow.com/questions/4443783/…
toegevoegd de auteur Dylan, de bron
Maar dan kun je niet toInt aanroepen zonder parameter ...
toegevoegd de auteur Mark Jayxcela, de bron

De REPL mag niet crashen - dat is een fout. Maar toch, overbelasting van namen is enigszins ontmoedigd en wordt ook in sommige contexten niet ondersteund. Gebruik gewoon een andere naam:

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

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