Неявное преобразование от Строки до Интервала в scala 2.8

Rubular свободен, прост в использовании и выглядит хорошим.

14
задан oxbow_lakes 12 November 2009 в 23:42
поделиться

3 ответа

Уже существует неявное преобразование в области из scala.Predef . Вам не нужно объявлять собственное неявное преобразование, чтобы добавить метод toInt в String . У вас есть 3 варианта (я бы выбрал последний!):

  • Измените имя метода на что-то вроде asInt
  • Отмените импорт преобразования в Predef
  • Не беспокойтесь об определении вашего владеть и использовать вместо него toInt , который поставляется в комплекте с библиотекой scala

. Обратите внимание, что scala будет использовать неявное преобразование в области видимости, только если оно уникально .

8
ответ дан 1 December 2019 в 08:17
поделиться

Дело в том, что Java не определяет метод toInt для String . В Scala этот метод определяется классом StringOps (Scala 2.8) или RichString (Scala 2.7).

С другой стороны, существует метод toInt также доступен на Int (может быть, через другой неявный?), Поэтому компилятор не знает, нужно ли преобразовать строку в StringOps через определенный неявный или в Int через свой собственный неявный.

Чтобы решить эту проблему, вызовите неявный явно.

object Imp {
  implicit def string2Int(s: String): Int = augmentString(s).toInt

  def f(i: Int) = i

  def main(args: Array[String]) {
    val n: Int = f("666")
  }
}
24
ответ дан 1 December 2019 в 08:17
поделиться

Думаю, у меня есть обходной путь.

Если я создаю RichString из аргумента String, происходит неявное преобразование RichString в Int с использованием неявного метода, который я предоставляю (это работает для 2.7.x и 2.8). Если я удалю свой неявный, я получаю ошибку типа.

object Imp {

  implicit def string2Int(rs: RichString): Int = rs.toInt

  def f(i: Int) = i

  def main(args: Array[String]) {
    val n: Int = f(new RichString("666"))

    println(n)
  }
}

Я все еще не понимаю, почему оба имплицита попали в область видимости и столкнулись, когда я предоставил неявное, и почему Predef не вошел в область действия, когда я этого не сделал. Не предоставил один для String to Int. Я полагаю, что вопрос о неявном преобразовании String в Int остается открытым.

m все еще не понимает, почему оба имплицита попали в область видимости и столкнулись, когда я предоставил неявное, и почему Predef не вошел в область, когда я не предоставил один для String to Int. Я полагаю, что вопрос о неявном преобразовании из String в Int остается открытым.

m все еще не понимает, почему оба имплицита попали в область видимости и столкнулись, когда я предоставил неявное, и почему Predef не попал в область видимости, когда я не предоставил один для String to Int. Я полагаю, что вопрос о неявном преобразовании String в Int остается открытым.

1
ответ дан 1 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: