Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

クラスの優先度の話

クラスは手前*1のものが優先されます。
というわけで...Stringメソッドを拡張して

class Object
  def to_param
    to_s
  end  
end

class TrueClass
  def to_param
    42
  end  
end

class String
  def to_param
    self.upcase
  end  
end  

class NeoString < String
  def to_param
    self.reverse
  end  
end

なんて関係だったとした場合...

NeoString.new('hoge').to_param
#=> "egoh"

と、NeoStringのメソッドが呼び出されます。
というわけで...上記に加えて

class Array
  def to_param
    collect {|e| e.to_param }.join('/')
  end
end

とすると

 ['foo', NeoString.new('bar'), 1, true, nil, false, Time.now].to_param
=> "FOO/rab/1/42//false/2014-08-19 23:15:39 +0900"

のようにto_paramが定義されているものはそのように、ソレ以外はto_sに従うようになります

*1:という表現が正しいかどうかわかりませんが