特異メソッドを定義するメソッド

久しぶりの更新。

やっぱり、環境が変わったもので、いろいろいっぱいいっぱいだったのでした。まだしばらくいっぱいいっぱいだと思う。

それはさておき、ここしばらく Ruby で「特異メソッドを定義するメソッド」を定義したくて悩んでいたのでした。さっきできたのでここに書きます。

特異メソッドを定義するメソッドってどんなんか、っていうと、こんなん。

c1 = C.new
c2 = C.new

c1.define_singleton_method :hoge do
  puts "Hoge!"
end

c1.hoge #=> Hoge!
c2.hoge #=> NoMethodError

実装はこんなん。書けた後だと結構簡単。

class C
  def define_singleton_method(name, &block)
    mod = Module.new do
      define_method name, &block
    end
    extend mod
  end
end

もっといい書き方があるような気もします。特に、同じオブジェクトに対してこのメソッドで大量に特異メソッドを定義すると、なにかよからぬことが起きそう。

追記

コメントで id:arikui1911 さんに添削していただきました。

追記 2009-02-23

今さらの追記ですが、ずーっと前からこのメソッドについては議論になってたみたいです。

[ruby-list:42851]Object#define_singleton_method がない??

で、Ruby 1.9.1 から (1.9 から?) Object#define_instance_method として、標準になったようです。