特異メソッドを定義するメソッド
久しぶりの更新。
やっぱり、環境が変わったもので、いろいろいっぱいいっぱいだったのでした。まだしばらくいっぱいいっぱいだと思う。
それはさておき、ここしばらく 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 として、標準になったようです。