ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

Rubyのputsメソッド、printメソッドはto_sメソッドを定義すると

改訂3版基礎 Ruby on Rails (KS IMPRESS KISO SERIES)でどうしてもわからないことがあった。

untitled.rb

class Robot
  def initialize(name)
    @name = name
    @x = @y = 0
  end

  def move(x,y)
    @x += x; @y += y
  end

  def to_s
    "#{@name}: #{@x},#{@y}"
  end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
puts robo1
robo2.move(10,20)
puts robo2

このコードを実行すると

$ ruby untitled.rb
ロボ1号: 0,0
ロボ2号: 10,20

と出力される。to_sメソッド呼び出してないけど、なんでto_sメソッド呼び出されているのかがわからなかった。 試しにpで出力させてみると表示が変わった。

#<Robot:0x007fdaaa0aa0f0 @name="ロボ1号", @y=0, @x=0>
#<Robot:0x007fdaaa0aa0a0 @name="ロボ2号", @y=20, @x=10>

もう少しググってみると答えがわかった。

www.task-notes.com

putsメソッドとprintメソッドはレシーバをto_sメソッドで文字列に変換してから出力する。 つまり、自分でto_sメソッドを定義すると、to_sメソッドの機能を上書きできてしまうようだ。 これを調べるのに1時間くらい時間がかかった。