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