特異クラス(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)