Почему zipWithIndex реализован в Iterable, а не Traversable? - PullRequest
8 голосов
/ 06 ноября 2011

Я читаю "Программирование в Scala 2ed".В разделе 24.4 отмечено, что Iterable содержит множество методов, которые невозможно эффективно написать без итератора.Таблица 24.2 содержит эти методы.Однако я не понимаю, почему некоторые из них не могут быть эффективно реализованы на итераторе.Например, рассмотрим zipWithIndex.

  def zipWithIndex[A1 >: A, That](implicit bf: CanBuildFrom[Repr, (A1, Int), That]): That = {
    val b = bf(repr)
    var i = 0
    for (x <- this) {
      b += ((x, i))
      i +=1
    }
    b.result
  }

Почему бы не переместить это определение в traversable?Мне кажется, что код может быть точно таким же, и по эффективности ничего не изменится.

Ответы [ 2 ]

11 голосов
/ 06 ноября 2011

Вы полностью правы, и ваша реализация должна работать.Нет веской причины для определения zipWithIndex в Iterable, а не Traversable;ни один из них не дает никаких гарантий относительно упорядочения элементов при обходе.

(Это мой первый ответ на StackOverflow. Надеюсь, что я помог. :) Если нет, пожалуйста, сообщите мне.)

10 голосов
/ 06 ноября 2011

Traversable не гарантирует порядок, в котором элементы будут посещаться, и требует только определения метода foreach со следующей подписью:

def foreach[U](f: Elem => U): Unit

Поскольку этому методу просто нужно вызывать f для каждого элемента в любом порядке, не имеет смысла иметь индекс для элементов, поскольку порядок может быть разным для каждого вызова foreach.

Редактировать: Это действительно просто объяснение, почему это не на Traversable. Как отметил Луиджи в комментариях, zipWithIndex будет иметь больше смысла для Seq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...