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, а не в "реальном" коде.