Ruby的to_s方法问题(来自Axe第2版)

根据斧头书(第2版),我们可以使用to_s如下。

class宋
   def to_s
     “歌曲”
  结束
结束

 song = Song.new()
 song.to_s

但是,它没有给我任何东西,为了向stdout打印一些东西,我应该跑

   def to_s
     p“歌”  
  结束

自书本编写以来,ruby1.8.2以后是否有任何变化? 我的ruby版本信息是1.8.7 for Mac。

ruby 1.8.7(2009-06-08 patchlevel 173)[universal-darwin10.0]

Pickaxe书使用了例如的通用符号

song.to_s"Song: My Way--Sinatra (225)"

表示"Song: My Way--Sinatra (225)"是左边表达式的值。 但是,除非您明确使用puts ,否则不会打印出来。

对象上的to_s的适当实现将返回该对象的字符串表示(例如,人的名称或博客post的标题和ID),但实际上本身不会产生任何副作用(例如输出内容。)

如果使用irb,交互式Ruby解释器会为您打印出每个表达式的值,而不会显式puts 。 例如

 $ irb irb(main):001:0> 2 + 2 => 4 

这个例子可能意味着输入一个像irb这样的REPL,它看起来像这样:

 irb> class Song .. def to_s .. "Song" .. end .. end => nil irb> song = Song.new() => Song irb> song.to_s => "Song" 

在你的情况下,你希望你的最后一行是:

 song = Song.new puts song.to_s 

是的, to_s总是将对象转换为字符串。 然后由您的程序使用该字符串 – 例如,通过将其写入stdout。

这是因为上面的方法只返回“歌曲”,它不打印它。 你的程序应该自己进行打印。