僕が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

こんな風に、JavaC++ではイディオム(定形句、決まった書き方)でしかないものをメソッドという形で書けることがすばらしいと思っている。
こういうのもメタプログラミングと表現していいのかしらん。

メモ

  • これだけだと、File.openに限った話に読める。もっと例を増やす必要がある
  • 自己ツッコミ。単なる高階関数やん
  • Lisp最大の武器、マクロに触れるべきか
  • 初めに苦労して、高階関数を定義する利点。正しい怠惰。

お詫び

そういえば、FileOutputStreamのコンストラクタは例外を投げるからちゃんと処理しないと行けなかった。まあ、意味は通じるから許して。