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
}