Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

クラスの優先度の話

クラスは手前*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:という表現が正しいかどうかわかりませんが