Scala: Прокачай мою библиотеку с перегрузками - PullRequest
2 голосов
/ 19 декабря 2010

Есть идеи, почему не работает следующее?

implicit def listExtensions[A](xs : List[A]) = new ListExtensions(xs)
class ListExtensions[A](xs : List[A])
{
    def foreach[B](f: (A, Int) => B)
    {
        var i = 0;
        for (el <- xs)
        {
            f(el, i);
            i += 1;
        }
    }
}

var a = List(1, 2, 3);
a foreach { (el, i) => println(el, i) };

Когда я компилирую это с помощью fsc 2.8.1, я получаю следующую ошибку: «неверное количество параметров; ожидается = 1: foreach {(el, i) => println (el, i)};». Я делаю что-то не так или просто нет способа добавить перегруженный метод с помощью трюка "pimp my library"?

P.S. Меня интересует не реализация итератора с текущим индексом foreach (мне известен метод zipWithIndex), а скорее о том, как перегрузка и неявные преобразования играют вместе.

Ответы [ 3 ]

10 голосов
/ 19 декабря 2010

Компилятор никогда не пытается использовать неявное преобразование, потому что в List уже есть метод foreach.Более конкретно, в разделе 7.3 Спецификации языка Scala (http://www.scala -lang.org / documents / files / ScalaReference.pdf) говорится, что неявное преобразование применяется в двух случаях, а второй случай относится к примеру:

В em выбора с e типа T, если селектор m не обозначает члена T.

Кроме того, вы можете выполнить foreach с индексом с помощьюиспользуя метод zipWithIndex.

scala> val a = List("Java", "Scala", "Groovy")
a: List[java.lang.String] = List(Java, Scala, Groovy)

scala> a.zipWithIndex.foreach { case (el, idx) => println(el + " at index " + idx) } 
Java at index 0
Scala at index 1
Groovy at index 2
1 голос
/ 19 декабря 2010
(a : ListExtensions[Int]) foreach { (el, i) => println(el, i) };

Или измените имя на foreachWithIndex

1 голос
/ 19 декабря 2010

Неявное преобразование сработает только тогда, когда вы попытаетесь использовать метод, который не существует для типа источника.

В этом случае в List есть метод foreach, поэтому преобразование не будет рассматриваться. Но вы получите ошибку за несоответствие ожидаемой подписи.

...