無名クラス

ふと思ったので.

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