🗂

Rubyのputsはto_sメソッドを呼び出します

2023/04/22に公開

記事を書くきっかけ

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メソッドを上書きしたことになるため今回のような出力となったようです。

参考

Ruby 3.2 リファレンスマニュアル
「puts、print、p」の違いについて【Ruby入門】

Discussion