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。
这是因为上面的方法只返回“歌曲”,它不打印它。 你的程序应该自己进行打印。