to_sとto_strの違いのメモ

  • Object#to_sはオブジェクトの文字列表現. Kernel#printやKernel#putsは文字列以外のオブジェクトが引数に渡された場合にこのメソッドを使って文字列に変換する.
  • to_strは暗黙の変換用. 暗黙の変換...? オブジェクトが「文字列が使われるすべての場面で代置可能であるような、文字列そのものとみなせるようなものという厳しいもの」とある.
class Test
  def to_s
    'to_s'
  end

  def to_str
    'to_str'
  end
end

t = Test.new

puts "#{t}" # "to_s"
puts "123"+t # "123to_str"
puts "to_strrrrr".include?(t) # 引数は"to_str"に変換される

Matzいわく「Stringと類似のメソッド集合を持たないオブジェクトはto_strを定義するべきではない」らしい. なるほどね