Scala 'fromFile' странность?

Я не понимаю, почему два бита кода, которые предназначены для того, чтобы делать то же самое, делают разные вещи в Scala.

Первый пример:

scala> val ggg = Source.fromFile("/somefile");
ggg: scala.io.BufferedSource = non-empty iterator

scala> ggg.getLines();
res67: Iterator[String] = empty iterator

Второй пример:

scala> Source.fromFile("/somefile").getLines();
res68: Iterator[String] = non-empty iterator

Разве они не хотят делать то же самое, или я чего-то не хватает?

Ответ 1

Кажется, это причуда (ошибка?) с BufferedSource.toString. Обратите внимание:

// no problem
scala> { val x = Source.fromFile("foo.txt"); x.getLines() }
res10: Iterator[String] = non-empty iterator

// ahh, calling toString somehow emptied our iterator
scala> { val x = Source.fromFile("foo.txt"); println(x.toString); x.getLines() }
non-empty iterator
res11: Iterator[String] = empty iterator

Чтобы показать значение выражения, REPL нужно вызвать BufferedSource.toString, и это имеет побочный эффект освобождения итератора.

Ответ 2

Похож на эту ошибку: SI-4662.

По-видимому, исправлено в trunk Changeset 25212, но не в 2.9.1, насколько я могу видеть.

В примечаниях к ошибкам он упоминал, что он, вероятно, проявляется только в REPL, а не в "реальном" коде.