Search code examples
scalaoverloadingenrich-my-library

Overloading the existing `toInt` method


The toInt method in StringLike doesn't take any arguments, and can only parse in decimal. So to parse binary, hex etc we need to resort to Java's Integer#parseInt(String s, int radix).

In an attempt to remedy this state of affairs, I tried the following

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

However,

"101".toInt(2)

causes the REPL compiler to "crash spectacularly" and doesn't work in compiled code either.

Is there some restriction on overloading existing methods using the "enrich my library" pattern?


Solution

  • Without the implicit, running "101".toInt(2) causes REPL to tell me that Int does not take parameters. So I guess what is happening is that it's running "101".toInt, then trying to call apply(2) on that, which doesn't make sense. I'd suggest a subtle rename of your pimped toInt to avoid the problem.

    edit

    I just had some success of my own. I explicitly defined a pimped string class as

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

    And REPL was happy:

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