🗂
Rubyのputsはto_sメソッドを呼び出します
記事を書くきっかけ
Rubyについて学んでいるときに、いろいろなコードを読んでいました。そのときにつまずいたことがあったので記事にしました。
つまずいたこと
例として、トランプカードのマークと数字を持つCardクラスというものがあるとします。
class Card
def initialize(suit, rank)
@suit = suit
@rank = rank
end
def to_s
"#{@suit}の#{@rank}"
end
end
card = Card.new("♥", "A")
puts card
このコードを実行すると
♥のA
と出力されます。
to_sメソッドを呼び出していないのになぜこのような結果が出力されるのかがわからなくてつまずいていました。
ちなみに、上記のコードでto_sメソッドを定義しない場合には、つぎのような結果となる。
#<Card:0x00007ffa3a2905e0>
なぜ?
Rubyの仕様として、putsメソッドはレシーバをto_sメソッドで文字列に変換してから出力するようです。to_sメソッドを自身で定義した場合は、to_sメソッドを上書きしたことになるため今回のような出力となったようです。
Discussion