私は(line-seq (reader "input.txt"))
を使ってテキストファイルから行を読みます。このコレクションは、私のプログラムで渡され、使用されます。`line-seq`を` reader`とともに使用すると、ファイルはいつ閉じられますか?
しかし、私は決定的にファイルを閉じていないので、これは悪いスタイルかもしれないと懸念しています。私は(with-open (line-seq (reader "input.txt")))
を使うことができないと想像しています。これは、シーケンス全体を横切る前にファイルストリームが閉じられる可能性があるからです。
ファイルの場合、reader
と合わせてlazy-seq
を避けてください。私がここで使うはずのパターンがありますか?
clojure.contrib.duck-streamsは非難されています:http://clojure.github.com/clojure-contrib/#duck-streams – pauldoo
@pauldoo私はこれに気付きませんでした。あなたは正しいですが、 'line-seq'と' read-line'関数は同じパターンを使って(.readLineによる)読者から文字列を取得します。それらを見てください([line-seq](https://github.com/clojure/clojure/blob/f86db9cc68773dd3e4a166c1ff7b81e4a98aa602/src/clj/clojure/core.clj#L2314)、[read-line](https:// github.com/clojure/clojure-contrib/blob/aa3f018f65006c78b08703e7adef04b7f39e1542/src/main/clojure/clojure/contrib/duck_streams.clj#L236))、もしあなたが怠け者であれば、ソースコードに 'read-line 'をつけることができます。 – m039
@pauldooもう一つの解決策は、怠惰を使用せず、変数全体にコンテンツをつかむことではなく、単に読者に.closeを使うことです。そして、このように(with-open [r(reader "input.txt")](make-smth-on-lines(line-seq r))) 'のように' with-open'を使うべきです。 – m039