从scala中读取stdio时的val评估

时间:2016-07-03 13:47:48

标签: scala stdin

该程序从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????   
    }
}

1 个答案:

答案 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)
}

请注意,此实现将导致整个迭代器加载到内存中。