Rubyのクラス定義

は実際には、クラスを生成するためにランタイム時に動作するコードだ。
長らく静的な言語を道具として使ってきたせいか、これを最初理解できなかった。

  • hoge.rb
class Hoge
  puts "class #{self.class}"
  puts "name  #{self.name}"
end
  • 実行結果
>ruby hoge.rb
class Class
name  Hoge

実行結果を見れば、classの宣言内でコードが実行されていることが解る。静的な言語にもスタティックコンストラクタという初期化用のコードブロックがあるが、それはあくまでクラスのメソッドであり、ランタイムがクラスをロードする際に実行しているのだが、Rubyの場合はクラス定義自体が実行コードなのである。

この例でputsメソッドの対象となっている'self'が指すオブジェクトは何か? Hogeクラス? 違う。
実行結果にも表示されているが、ここでの'self'はClassクラスであり、HogeはClassクラスのオブジェクトなのだ。

Rubyにおけるクラスがランタイム時に解釈されて実行されるコードであることは、クラスの動的な拡張が実行時に簡単にできることを意味する。

  • sigleton.rb
a = "私の名前はカルメンです"
puts a.to_s

class <<a
  def to_s
    "#{self} 勿論あだ名に決まってます。"
  end
end 
puts a.to_s
  • 実行結果
>ruby singleton.rb
私の名前はカルメンです
私の名前はカルメンです 勿論あだ名に決まってます。

コード例の'class <