時々、ファイルを開いてその内容を読み取り、機能的な操作を行ってデータを変数に格納する必要があることに気づきました。これは、次のコード行になります。
@some_vars = File.open("items.txt").read.chomp!.split(',')
ここに2つの質問があります:
- この行の後でFileインスタンスは
File.open()
閉じられますか? - 読みやすさを犠牲にすることなく、そのようなファイルインスタンスを閉じるにはどうすればよいですか?
投稿した例では、ファイル記述子は自動的に閉じられません。記述子でFile#closeを手動で呼び出すか、インタープリターが終了したときにRubyにファイルを自動的に閉じさせる必要があります。
ファイルを自動的に閉じる場合は、File#openブロック構文が必要です。
File.open('items.txt') { |f| f.read.chomp!.split(',') }
その後、Rubyは、ブロックが終了するたびにファイルを閉じます。
ブロックインを使用してもFile.open
、たとえばアプリケーションが一時停止されている場合など、ファイルが常に閉じられるとは限りません。このような状況から保護するための秘訣があります。
f = File.open('items.txt', 'w')
at_exit { f.flush; f.close }
その後、at_exit
ブロックはアプリケーションの終了時またはプログラムの終了時に実行されます。