1
をブロックし、最終的にそれを閉じようとすると、正常に動作します:問題のコードスニペット後
def using[A, B <: {def close(): Unit}] (closeable: B) (f: B => A): A =
try { f(closeable) } finally { closeable.close() }
def loadDictionaryFromNet():List[String] =
using(Source.fromURL("http://www.mieliestronk.com/corncob_caps.txt", "UTF-8"))(_.getLines().toList)
val dictionary = loadDictionaryFromNet() filter(_.forall(_.isLetter))
しかし、私は以下のようにSeq[String]
にタイプを変更しよう:
def using[A, B <: {def close(): Unit}] (closeable: B) (f: B => A): A =
try { f(closeable) } finally { closeable.close() }
def loadDictionaryFromNet():Seq[String] =
using(Source.fromURL("http://www.mieliestronk.com/corncob_caps.txt", "UTF-8"))(_.getLines().toSeq)
val dictionary = loadDictionaryFromNet() filter(_.forall(_.isLetter))
その後
Exception in thread "main" java.io.IOException: stream is closed
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.ensureOpen(HttpURLConnection.java:3348)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3373)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
...
また、タイプをに変更すると次の例外がスローされます。それは再び動作します。
toSeq
は実際には完全に消費されずにいくらか遅れている部分的にレイジーなストリームを生成するように感じます。
フードの中で何が起こるか説明できますか?
ありがとうございました。この場合、 'TraversableOnce'が' Stream'を使う理由は?私は最初に、おそらくそれが原則的に怠け者の一部であるBufferedSourceを扱うという事実と関係があると考えました。しかし、確かに言うことはできません。 –