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

sch*_*mmd 8 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
  }
Run Code Online (Sandbox Code Playgroud)

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

Har*_*son 11

你是完全正确的,你的实现应该有效.没有充分理由zipWithIndex定义Iterable和不定义Traversable; 既不保证遍历中元素的排序.

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


kas*_*ens 10

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

def foreach[U](f: Elem => U): Unit
Run Code Online (Sandbox Code Playgroud)

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

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