为什么`Source.fromFile(...).getLines()`在我迭代之后是空的?

Ant*_*nin 2 scala side-effects

对我来说,(行< - 行)是如此具有破坏性!它完全展开了行迭代器.因此,运行以下代码段将使size = 0:

  val lines = Source.fromFile(args(0)).getLines()
  var cnt = 0
  for (line <- lines) {
    cnt = readLines(line, cnt)
  }
  val size = lines.size
Run Code Online (Sandbox Code Playgroud)

像这样具有隐藏的副作用是正常的Scala练习吗?

axe*_*l22 5

Source.getLines()返回一个迭代器.对于每一个迭代,如果调用批量操作如foreach上述,或map,take,toList等等,然后迭代器是处于可用状态不再.这是Iterators的合同,更一般地说,是继承的类TraversableOnce.

特别重要的是要注意,除非另有说明,否则在调用方法之后永远不应使用迭代器.两个最重要的例外也是唯一的抽象方法:next和hasNext.

继承的类不是这种情况Traversable- 对于那些可以根据需要多次调用批量遍历操作的类.