私は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'
私は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'
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)を別々に扱う(動作する)。メソッドのドキュメントには常に記述する必要があります。
優秀な説明 – mko
私はRubyを初めて使用しているため、コードを実行できません。私は "file = open(file_name)"を試みましたが、main:Object(NoMethodError)のメソッドdo_openは未定義です。このdo_openメソッドはどこから来たのですか? – Robert3452
いいえ、彼らは同じことを意味するものではありません。最初の例では、ブロックが処理された後にファイルが自動的に閉じられます。 2番目の例では、手動でnewFile.close
を呼び出すのはあなたの責任です。
私は大したことではないと思いますが、クラスメソッドを 'File :: open'ではなく' File.open'として記述する方がはるかに一般的です。 – Telemachus
'code 2'は' code 1'のように自動的にファイルを閉じません。したがって、 'newFile.close'を行う必要があります。 –