Scala 为什么在迭代器上调用size方法会将光标推到末尾?

Scala 为什么在迭代器上调用size方法会将光标推到末尾?,scala,Scala,在下面的代码中,我在数组中迭代了一个迭代器,结果与预期的一样: val array = Array(List("1").iterator) //> array : Array[Iterator[String]] = Array(non-empty iterator) for(a <- array){ //a.size for(element <- a){ println(element)

在下面的代码中,我在数组中迭代了一个迭代器,结果与预期的一样:

val array = Array(List("1").iterator)     //> array  : Array[Iterator[String]] = Array(non-empty iterator)

    for(a <- array){
        //a.size
        for(element <- a){
            println(element)          //> 1
        }
    }
为什么会这样?检查元素的大小不应该对集合的迭代产生影响?查看大小方法:

  def size: Int = {
    var result = 0
    for (x <- self) result += 1
    result
  }
def大小:Int={
var结果=0

对于(x,因为在迭代器上调用
.size
需要它迭代所有元素以对它们进行计数

编辑以详细说明:

迭代器具有状态:在任何给定点,调用其
next
函数返回下一个元素并提升其状态。为了遇到所有元素(例如,对它们进行计数),它必须调用
next
,直到没有更多元素。此时,它的状态处于末尾,因此迭代器不再有用


请参阅一个相关的注释,这是一种特性,对于那些在变得无用之前只需要“遍历”一次的事物,迭代器就是这样一种特性。

因为在迭代器上调用
.size
需要迭代器迭代所有元素,以便对它们进行计数

编辑以详细说明:

迭代器具有状态:在任何给定点,调用其
next
函数返回下一个元素并提升其状态。为了遇到所有元素(例如,对它们进行计数),它必须调用
next
,直到没有更多元素。此时,它的状态处于末尾,因此迭代器不再有用


另一个相关的注意事项是,请参见,在事物变得无用之前,您应该只“遍历”一次。迭代器就是这样一个东西。

因为迭代器不是关于游标的,它们是关于消费的。因为迭代器不是关于游标的,它们是关于消费的。阅读它声明的文档“集合的模板特征,可以只遍历一次或一次或多次。"这表明这样的集合可以在5年后被遍历不止一次-
TraversableOnce
是几乎每个集合都会扩展的一般特征。因为
TraversableOnce
扩展了
TraversableOnce
,所以可能有一个
TraversableOnce
不是
可遍历的实例
。将
Traversable
视为您可以多次遍历它的指示。您引用的文档在某种程度上具有误导性。阅读文档时,它表示“集合的模板特征,可以只遍历一次,也可以遍历一次或多次。”这表明这样的集合可以在5年后被遍历不止一次-
TraversableOnce
是几乎每个集合都会扩展的一般特征。因为
TraversableOnce
扩展了
TraversableOnce
,所以可能有一个
TraversableOnce
不是
可遍历的实例
。将
Traversable
视为您可以多次遍历它的指示。您引用的文档在这个意义上有些误导。
  def size: Int = {
    var result = 0
    for (x <- self) result += 1
    result
  }