Как вы определяете неявное преобразование современным способом? - PullRequest
1 голос
/ 18 ноября 2011

глупый вопрос, но ни один из примеров не работает для меня;Классическая статья " Pimp my Library " содержит ошибки, и даже у самого простого кода есть проблемы.

Кстати.Я предполагаю, что вы должны поместить метод преобразования в объект (многие фрагменты пропускают эту часть).Согласно книге PiS, кажется, что неявное зависание def нормально, но это также дает мне ошибку.

object Minutes
{
  implicit def toMinutes(x : Int) = new Minutes(x)
}

class Minutes(private val x : Int)
{
  def minutes = x.toString+"m"
}

object MainApp {

  def main(args : Array[String])
  {
     println(5.minutes)
     ...

Ошибка - «значение минут не является членом Int».

Вопрос

Что мне не хватает?Scala 2.9.1.

Ответы [ 3 ]

9 голосов
/ 18 ноября 2011

Все, что вам нужно, это перенести неявное преобразование в область, в которой вы хотите его использовать, чтобы компилятор мог его найти ...

def main(args : Array[String]) {
   import Minutes._
   println(5.minutes)
}
7 голосов
/ 18 ноября 2011

Неявное преобразование должно быть в области видимости, например,

def main(args : Array[String]) {
  import Minutes._
  println(5.minutes)
  ...
}

Есть и другие способы, например, используя объекты пакета.

1 голос
/ 19 ноября 2011

Пример из статьи Pimp my library можно получить следующим образом:

class RichArray[T: Manifest](value: Array[T]) {
  def append(other: Array[T]): Array[T] = {
    val result = new Array[T](value.length + other.length)
    Array.copy(value, 0, result, 0, value.length)
    Array.copy(other, 0, result, value.length, other.length)
    result
  }
}

implicit def enrichArray[T: Manifest](xs: Array[T]) = new RichArray[T](xs)

Вам нужен контекстный предел для T: [T: Manifest] - это сокращение от [T](implicit m: Manifest[T]). Манифест - это способ передачи значения T методу во время выполнения, когда T известен. Обычно параметризованная информация о типе используется компилятором для обеспечения безопасности типов во время компиляции, но не включается в байт-код, потому что JVM не может ее обработать (стирание типа). Коллекции Scala изменились в версии 2.8, так что по соображениям производительности массивы теперь не переносятся автоматически с помощью магии компилятора, поэтому стало необходимым предоставление манифеста для универсальных операций.

Другое изменение - аргумент (xs) для new RichArray[T]. Я думаю, что это опечатка.

...