Перегрузка существующего метода `toInt` - PullRequest
7 голосов
/ 27 октября 2011

Метод toInt в StringLike не принимает никаких аргументов и может анализировать только в десятичном виде. Поэтому для разбора двоичного, шестнадцатеричного и т. Д. Нам нужно прибегнуть к Java Integer#parseInt(String s, int radix).

Пытаясь исправить такое положение вещей, я попробовал следующее

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

Однако,

"101".toInt(2)

заставляет компилятор REPL "эффектно зависать" и также не работает в скомпилированном коде.

Существуют ли ограничения на перегрузку существующих методов с использованием шаблона "enrich my library"?

Ответы [ 2 ]

3 голосов
/ 28 октября 2011

Без неявного выполнения "101".toInt(2) заставляет REPL сказать мне, что Int не принимает параметры.Я думаю, что происходит то, что он запускает "101".toInt, а затем пытается вызвать apply(2), что не имеет смысла.Я бы посоветовал слегка переименовать вашего сутенера toInt, чтобы избежать проблемы.

edit

У меня только что был собственный успех.Я явно определил класс строчной строки как

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

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

И REPL был счастлив:

scala> "101".toInt(2)
res4: Int = 5
1 голос
/ 28 октября 2011

REPL не должен падать - это ошибка.Но даже в этом случае перегрузка имен несколько не рекомендуется и также не поддерживается в некоторых контекстах.Просто используйте другое имя:

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

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