次のコードにはRuby1.8.6を使用しています。
# Create an array and override the #to_s on that object
thing = [1,2,3]
def thing.to_s
'one'
end
print "Using print: "
print thing
puts
puts "Using puts: "
puts thing
出力:
Using print: one
Using puts:
1
2
3
つまり、物事は配列であり、私は物事#to_sをオーバーライドしました。printはオーバーライドされた実装を使用しているようですが、putsは使用していません。なんで?
Kernel#putsとKernel#print(C実装)のソースコードをたどったところ、それらが非常に異なる実装であることがわかりました。この背後にある設計上の決定(もしあれば)は何でしょうか?
ちなみに、私が書いた別のクラスのインスタンスとして(または私が試したHash / String / other-classesとして)ものを作成する場合、printとputsの両方がto_sのオーバーライドされた実装を使用します。