2011-08-10 12 views
11

全く同じことをするための2ビットのコードがScalaで異なることを理解できません。Scala 'fromFile'奇妙なことは?

まず例:

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 

が、彼らは同じことを行うことを意味するものではない、または私は何かが足りないのですか?

+0

セミコロンは不要です。それはREPL(2.8.2.RC1)の私のために働く。 –

+0

私はセミコロンが好きです。 –

+0

;)それは消える。 –

答えて

6

これは、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を呼び出す必要があり、これはイテレータを空の副作用があります。

+0

これを元にして、2.8.0.finalの元のレポートをFreeBSDで再作成することはできません。大きなファイル、1行のファイル、空のファイルを試しました。 –

+1

OS Xで2.9.1RC1を使用しています。回帰のように聞こえます。私は夜間のビルドでこれを再現できないことに気づいたので、トランクに固定されているようです。 –

+0

私は '2.9.0.1'です。 –

2

このバグのように見えます:SI-4662

明らかに私が見る限り、トランクChangeset 25212には固定されていますが、2.9.1には固定されていません。

「本当の」コードではなく、REPLだけに現れていると言われているバグノートです。

+1

私は2.9です.1.finalと私は実際のコードでバグを取得しています –