特異クラス(Object Specific Class)を、初めて使ってみた。なんか、嬉しい。

特異クラスというのはあるクラスの特定のインスタンスをサブクラスすること if 僕の理解が正しければ?

よくある例は、Stringクラスのto_sを書き換えてしまいましょうというやつ:

a = "Hello"

class <<a
  # Override to_s method of Sting
  def to_s
      "Object specific class of a '#{self}' " 
  end
end

ポイントは、Stringクラスのaというインスタンスが作られてしまった後に、そのインスタンスのメソッドを書き換えたり、追加したりできてしまうってとこだと、僕は、今日気がついてしまった。

僕が実際に使った場面は、こんな感じ。データベースから読んで来た、あるフィールドにYAMLが入っている。YAML.loadした後に、HashだかArrayだかが内容に応じて返される。
この返されたオブジェクトをERbの中で使いたい。そのためには、getterメソッドが必要になる。そこで、特異クラスを使って、欲しいメソッドをYAMLによって生成されたオブジェクトにコントローラーの中で付け加えてしまった。これで、Viewの中では普通にform.text_field :urlとか書けるようになった。

      mp = <<-END
        class << yamled
          def url
            self[:url]
          end
          
          def desc
            self[:desc]
          end
          
          def title
            self[:title]
          end
        end
      END
      eval(mp)