该程序从std io读取一些数字(新行上的每个数字)。我只输入一次数字! 现在,值“it”应该在定义点(而不是lazy val)进行评估,“it”应该被RHS的结果替换。
因此,当第一个println(it.size)被调用时,“it”已被评估。那为什么对prinln的第二次调用总是返回零?似乎它试图从std io再次读取,因为没有任何内容被读取它返回零。
object Test {
def main(args: Array[String]) {
val it= io.Source.stdin.getLines().map(_.toInt)
println(it.size) // prints correct number of lines
println(it.size) // prints zero always????
}
}
答案 0 :(得分:1)
那为什么对prinln的第二次调用总是返回零
因为Source.getLines
返回一个Iterator[String]
,你正在使用it.size
的调用完全迭代,这意味着迭代器到达它的结束。 This is how size
is defined on TraversableOnce[A]
(Iterator[A]
延伸):
def size: Int = {
var result = 0
for (x <- self) result += 1
result
}
如果您希望能够多次迭代,则需要首先实现迭代器:
def main(args: Array[String]): Unit = {
val it = io.Source.stdin.getLines().map(_.toInt).toSeq
println(it.size)
println(it.size)
}
请注意,此实现将导致整个迭代器加载到内存中。