7 votes

Surcharge de la méthode existante `toInt`.

Le site toInt méthode dans StringLike ne prend pas d'arguments, et ne peut être analysé qu'en décimal. Ainsi, pour analyser des données binaires, hexagonales, etc., nous devons recourir à la fonction Integer#parseInt(String s, int radix) .

Pour tenter de remédier à cet état de fait, j'ai essayé ce qui suit

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

Cependant,

"101".toInt(2)

provoque un "plantage spectaculaire" du compilateur REPL et ne fonctionne pas non plus dans le code compilé.

Existe-t-il une restriction sur la surcharge des méthodes existantes en utilisant le modèle "enrichir ma bibliothèque" ?

3voto

Dylan Points 5887

Sans l'implicite, l'exécution "101".toInt(2) fait que REPL me dit que Int ne prend pas de paramètres. Donc, je suppose que ce qui se passe, c'est qu'il exécute "101".toInt puis en essayant d'appeler apply(2) sur ça, ce qui n'a pas de sens. Je suggérerais un subtil changement de nom de votre pimped toInt pour éviter le problème.

modifier

J'ai juste eu un peu de succès de mon côté. J'ai défini explicitement une classe de chaîne de caractères maquée comme étant

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

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

Et REPL était heureux :

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

1voto

Rex Kerr Points 94401

Le REPL ne devrait pas planter - c'est un bogue. Mais même ainsi, la surcharge des noms est quelque peu déconseillée et n'est pas supportée dans certains contextes. Utilisez simplement un nom différent :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X