2011-07-26 6 views
6

私はRubyには新しく、現在はPickaxeの本を読んでいます。私はFile.openセクションを見つけました。ここでは、ブロックをFile.open呼び出しのパラメータとして受け取り、ファイルが閉じられていることを保証します。今これは足に自分自身を撃つのを避けるために絶対に素晴らしい方法のように聞こえる、私はつま先で危険なほど低いので、私はそれを行くと思います。ここでは(それが重要ならばIRBに)私が書いたものである:File.openとRuby 1.8.7のブロック

File.open('somefile.txt', 'r').each { |line| puts line }`` 

私の期待は右、ファイルsomefile.txtは、読んで、開いて印刷して閉じになるだろうということでしたか?私が間違って言うことができる限り。開いているファイルハンドルを見るためにlsofを使用しても、まだ開いています。しかし、私は

f = File.open('somefile.txt', 'r').each { |line| puts line } 
f.close() 

を行う場合、私は、この例では、間違ったブロックを使用していたり​​ブロックで使用するとき、私はFile.openの意味を理解するために失敗しています。私はruby-doc.org related to File.openのセクションを読んだが、それはちょうど私がやっていることが期待どおりに働くべきであることを確認するようだ。

誰も私が間違っていることを説明できますか?

答えて

8

ブロックの後にファイルを閉じるために、あなたがいないeachに、直接File.open()にブロックを渡す必要が:

File.open('somefile.txt', 'r') do |f| 
    f.each_line { |l| puts l } 
end 

File.open(…).each {…}はそれを閉じずに開いたファイルを反復処理されます。

+0

File.open( 'somefile.txt'、 'r'){| f | f.each_line {| line | puts line}}も同様に動作します。ありがとう! – OldTroll

関連する問題