僕がRubyを好きな訳
お風呂でぼんやりと考えてたネタ。
例えば、Javaでファイルを開いて、"hoge"と書き込むプログラムはこうなる。
void f(){ FileOutputStream out = new FileOutputStream("sample.txt"); out.write("hoge"); out.close(); }
でもこれだと、FileOutputStream.writeで例外が起こると正しく閉じられないので、finnallyを使わないといけない。
void f(){ FileOutputStream out = new FileOutputStream("sample.txt"); try{ out.write("hoge"); }finally{ out.close(); } }
でも、Rubyだとこれをまとめてやってくれる便利なメソッドがある。
File.open("sample.txt"){|io| io.print "hoge" }
で、ここで言いたいのは、Rubyのほうがこんな便利なメソッドがあるよ、ってことじゃない。
実は、このopenメソッドは特殊なメソッドというわけじゃなくて、簡単に定義できる。
class File def self.open(path,&block) io = File.new path begin block.call io rescue io.close end end end
こんな風に、JavaやC++ではイディオム(定形句、決まった書き方)でしかないものをメソッドという形で書けることがすばらしいと思っている。
こういうのもメタプログラミングと表現していいのかしらん。
メモ
お詫び
そういえば、FileOutputStreamのコンストラクタは例外を投げるからちゃんと処理しないと行けなかった。まあ、意味は通じるから許して。