为什么zipWithIndex在Iterable中实现而不是Traversable?

时间:2011-11-06 05:34:08

标签: scala

我正在阅读“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
  }

为什么不将此定义移动到遍历?在我看来,代码可能完全相同,效率也没有区别。

2 个答案:

答案 0 :(得分:11)

你完全正确,你的实施应该有效。没有充分理由在zipWithIndex而非Iterable中定义Traversable;对于遍历下元素的排序都没有任何保证。

(这是我在StackOverflow上的第一个答案。希望我一直很有帮助。:)如果我没有,请告诉我。)

答案 1 :(得分:10)

Traversable不保证访问元素的顺序,只需要您使用以下签名定义foreach方法:

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

由于此方法只需要以任何顺序为每个元素调用f,因此对元素建立索引没有意义,因为每次调用foreach时顺序可能不同。

编辑:这只是一个解释,为什么它不在Traversable上。正如Luigi在评论中指出的那样,zipWithIndex在Seq上更有意义。