無名クラス
ふと思ったので.
n = class Nameless def hoge puts "hello" end end.new n.hoge => エラー
上の場合,全然無名でもなんでもないけれど,宣言の後にいきなりnewはできない.なぜなら,classの宣言の返り値はnilだから.これは,irbでやってみた例.
>> p class Nameless; end nil
でもClass.newを使えば,無名クラスは実現できる.
n = Class.new{ define_method(:hoge){ puts "hello" } }.new n.hoge => hello
このとき,nのクラスはどうなってるのか?
p n => #<#<Class:0x265bc>:0x26508> p n.class => #<Class:0x265bc>
Procあるいはlambdaに通じるものを感じるね.これは,チョット前にやったUnboundMethodと比べると,より使い道がありそう.
追記
後になって,無名クラスとはなんぞやとググって見ると,どうもインタフェースとかを継承してやるのが一般的だそうで.Class.newで継承はどうするかというと,こんなかんじ.
class Fuga def fuga puts "world" end def hoge puts "piyo" end end n = Class.new(Fuga){ # 継承 define_method(:fuga){ puts "hello" } }.new Fuga.new.fuga => world n.fuga => hello n.hoge => piyo