我正在阅读“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
}
为什么不将此定义移动到遍历?在我看来,代码可能完全相同,效率也没有区别。
答案 0 :(得分:11)
你完全正确,你的实施应该有效。没有充分理由在zipWithIndex
而非Iterable
中定义Traversable
;对于遍历下元素的排序都没有任何保证。
(这是我在StackOverflow上的第一个答案。希望我一直很有帮助。:)如果我没有,请告诉我。)
答案 1 :(得分:10)
Traversable不保证访问元素的顺序,只需要您使用以下签名定义foreach方法:
def foreach[U](f: Elem => U): Unit
由于此方法只需要以任何顺序为每个元素调用f
,因此对元素建立索引没有意义,因为每次调用foreach
时顺序可能不同。
编辑:这只是一个解释,为什么它不在Traversable上。正如Luigi在评论中指出的那样,zipWithIndex在Seq
上更有意义。