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>
もう少しググってみると答えがわかった。
putsメソッドとprintメソッドはレシーバをto_s
メソッドで文字列に変換してから出力する。
つまり、自分でto_sメソッドを定義すると、to_s
メソッドの機能を上書きできてしまうようだ。
これを調べるのに1時間くらい時間がかかった。