为什么在迭代器上调用size方法会将游标推送到结尾?

时间:2014-04-16 20:59:41

标签: 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)          //> 1
        }
    }

但是如果我添加a.size,似乎这会将迭代器光标推到集合的末尾,因为迭代器显示为空:

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

for(a <- array){
    a.size
    for(element <- a){
        println(element)
    }
}

为什么会这样?检查元素的大小应该对集合的迭代产生影响吗?看大小方法:

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

它没有修改迭代器本身吗?

在Scala工作表

中尝试了这些示例

1 个答案:

答案 0 :(得分:5)

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

编辑以详细说明:

迭代器具有状态:在任何给定点,调用其next函数返回下一个元素并使其状态前进。为了遇到所有元素(例如计算它们),它必须调用next直到没有更多元素。那时,它的状态就在最后,因此迭代器不再有用了。

在相关的说明中,请参阅TraversableOnce,这是您应该只追踪过的事情的特征。有一次他们变得无用之前。迭代器就是这样的一个。