2011-08-10 43 views
11

我不明白爲什麼兩個代碼要完成相同的事情,在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

這似乎是一個怪癖(bug?)與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

我無法在FreeBSD上重複這個或2.8.0.final的原始報告。我嘗試了大文件,一行文件和空文件。 –

+1

我在OS X上使用2.9.1RC1。聽起來像是迴歸。我只注意到我無法在每晚的構建中重現這一點,所以它似乎被固定在主幹中。 –

+0

我在'2.9.0.1'上。 –

2

看起來像這個bug:SI-4662

顯然固定在主幹Changeset 25212,但不是在2.9.1據我所知。

在錯誤提示中提到它可能僅在REPL中顯示,而不在「真實」代碼中。

+1

我在2.9 .1.final,我在實際的代碼中得到了這個錯誤 –