オブジェクトで「p」を呼び出すと、なぜ.to_sメソッドを呼び出すのに、実際には文字列を返さないのか、不思議です。明示的に.to_sを呼び出すと、文字列として明確に出力されます。
1.9.3p194 :078 > class Test
1.9.3p194 :079?> def to_s
1.9.3p194 :080?> puts 'to string called'
1.9.3p194 :081?> "testing"
1.9.3p194 :082?> end
1.9.3p194 :083?> end
=> nil
1.9.3p194 :084 > x = Test.new
to string called
=> testing
1.9.3p194 :085 > x
to string called
=> testing
1.9.3p194 :086 > p x
to string called
testing
to string called
=> testing
1.9.3p194 :087 > p x.to_s
to string called
"testing"
=> "testing"