2010-11-19 19 views
25

私はBlockについて質問しましたが、2つのコードは同じ意味ですか?File.open with block withブロック

コード1

File::open('yozloy.txt','w') do |f| 
    f << 'Some contains' 
end 

コード2

newFile = File::open('yozloy.txt','w') 
newFile << 'Some contains' 
+1

私は大したことではないと思いますが、クラスメソッドを 'File :: open'ではなく' File.open'として記述する方がはるかに一般的です。 – Telemachus

+0

'code 2'は' code 1'のように自動的にファイルを閉じません。したがって、 'newFile.close'を行う必要があります。 –

答えて

25

DarkDustはすでにこれらの方法が異なっていると言いました。なぜあなたがこの質問をしたのか推測できると思いますので、ブロックをもう少し説明します。

ルビーのブロックは、一部の方法のパラメータに過ぎません。それは単に異なる構文ではありません。

(オプションの)ブロックを受け入れるメソッドは、通常、ブロックで呼び出されたかどうかをテストするための条件を持ちます。

は、この非常に簡単な例を考えてみます(本当のFile.openは似ているが、それは、たとえば、ファイルがあなたのブロックにエラーが発生した場合でも閉鎖されることを保証)すべての方法が、一般的には

def open(fname) 
    self.do_open(fname) 
    if block_given? 
    yield(self) # This will 'run' the block with given parameter 
    self.close 
    else 
    return self # This will just return some value 
    end 
end 

ブロック(block)とブロック(block)を別々に扱う(動作する)。メソッドのドキュメントには常に記述する必要があります。

+0

優秀な説明 – mko

+0

私はRubyを初めて使用しているため、コードを実行できません。私は "file = open(file_name)"を試みましたが、main:Object(NoMethodError)のメソッドdo_openは未定義です。このdo_openメソッドはどこから来たのですか? – Robert3452

33

いいえ、彼らは同じことを意味するものではありません。最初の例では、ブロックが処理された後にファイルが自動的に閉じられます。 2番目の例では、手動でnewFile.closeを呼び出すのはあなたの責任です。