0

時々、ファイルを開いてその内容を読み取り、機能的な操作を行ってデータを変数に格納する必要があることに気づきました。これは、次のコード行になります。

@some_vars = File.open("items.txt").read.chomp!.split(',')

ここに2つの質問があります:

  • この行の後でFileインスタンスはFile.open()閉じられますか?
  • 読みやすさを犠牲にすることなく、そのようなファイルインスタンスを閉じるにはどうすればよいですか?
4

3 に答える 3

4

いいえ、File.openファイル ハンドルを開いたままにします。代わりに使用する必要がIO.readあります。これは、ファイルの内容全体を返し、完了したらファイルを閉じます。

IO.read("items.txt").chomp!.split(',')

これは、ブロックを に渡すよりも、ワンライナーの場合は少し短くなりFile.openます。

于 2012-06-06T16:58:39.447 に答える
1

投稿した例では、ファイル記述子は自動的に閉じられません。記述子でFile#closeを手動で呼び出すか、インタープリターが終了したときにRubyにファイルを自動的に閉じさせる必要があります。

ファイルを自動的に閉じる場合は、File#openブロック構文が必要です。

File.open('items.txt') { |f| f.read.chomp!.split(',') }

その後、Rubyは、ブロックが終了するたびにファイルを閉じます。

于 2012-06-06T17:00:07.497 に答える
0

ブロックインを使用してもFile.open、たとえばアプリケーションが一時停止されている場合など、ファイルが常に閉じられるとは限りません。このような状況から保護するための秘訣があります。

f = File.open('items.txt', 'w')

at_exit { f.flush; f.close }

その後、at_exitブロックはアプリケーションの終了時またはプログラムの終了時に実行されます。

于 2012-06-06T17:09:10.133 に答える