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 <