2011-08-14 5 views
3

私は2つの質問があります: 1 - 私はこのコードの復帰、という事の意味を理解していない:私に説明してくださいブロックの有無によるFile.open()の違いは何ですか?

File.open("a.txt") do |i| 
    puts i 
end 

2 - とそのコードの間と コード以下の違いは何である私に説明してください:付き

File.open("a.txt").each do |i| 
    puts i 
end 

おかげ

答えて

6

File.open("some_file.txt") do |file| 
    puts file.read 
end 

をオープンする方法は、とあなたのブロックを呼び出しますa ファイルインスタンスを開き、ブロックが戻るとファイル参照をクリーンアップし、ファイルを閉じてフラッシュしますアプリケーションがファイルハンドラをリークすることはありません。通常、ファイルを閉じるのを忘れてしまったり、ファイル処理が例外を引き起こす可能性があることを考慮していません。

あなたはこのようにそれを行うと:

file = File.open("some_file.txt") 
puts file.read 

openメソッドはあなたにファイルインスタンスが作成されますが、今あなたが混乱をクリーンアップして、あなたはもうそれを必要としないときに、ファイルを閉じるための責任があります。したがって、このようにしている場合は、ファイルをbegin/rescueブロックに設定し、何か問題が生じた場合にファイルを閉じるための確実な句を追加する必要があります。

特に必要がない限り、この2番目のバージョンは使用しないでください。最初のバージョンはよりシンプルで安全です。ファイルに行ったことをすべてクローズ/クリーンアップする必要はありません。

+0

あなたはあなたの第二の例では、ファイルを閉じることを忘れ役立ちます

希望:D – fl00r

+0

うん、それは意図です:D –

2

通常、コンソールにこのような簡単なものを入力して、すぐに回答を得ることができます。

ので、内容のファイルをA.TXTのために:

one 
two 
three 

あなたのコードは、これを行います。

[[email protected]]$ irb 
ruby-1.9.2-p180 :007 > File.open("a.txt") do |i| 
ruby-1.9.2-p180 :008 >  puts "a.txt:"+i.to_s 
ruby-1.9.2-p180 :009?> end 
a.txt:#<File:0x000001010e7ae8> 
=> nil 
ruby-1.9.2-p180 :010 > File.open("a.txt").each do |i| 
ruby-1.9.2-p180 :011 >  puts "a.txt:"+i.to_s 
ruby-1.9.2-p180 :012?> end 
a.txt:one 
a.txt:two 
a.txt:three 
=> #<File:a.txt> 

だから、最初のものはFileオブジェクトの参照/アドレスを出力します。

2番目のファイルは、ファイル内の行を繰り返し処理し、それぞれを出力します。

関連する問題