根据斧头书(第2版),我们可以使用to_s如下。
class Song def to_s "Song" end end song = Song.new() song.to_s
但是,它没有给我任何东西,为了给stdout打印一些东西,我应该运行
def to_s p "Song" end
自本书编写以来,红宝石1.8.2以后是否有任何变化? 我的ruby版本信息是1.8.7 for Mac。
ruby 1.8.7(2009-06-08 patchlevel 173)[universal-darwin10.0]
答案 0 :(得分:3)
Pickaxe书使用了一种常见的符号,例如
song.to_s
→"Song: My Way--Sinatra (225)"
表示"Song: My Way--Sinatra (225)"
是左侧表达式的值。但是,除非您明确使用puts
。
对象上to_s
的适当实现将返回该对象的字符串表示形式(例如,某个人的名称或博客文章的标题和ID),但实际上本身不会产生任何副作用(比如输出一些东西。)
如果您使用irb,交互式Ruby解释器会为您打印出每个表达式的值,而不会显示puts
。 e.g。
$ irb
irb(main):001:0> 2 + 2
=> 4
答案 1 :(得分:2)
这个例子可能意味着要输入像irb
这样的REPL,如下所示:
irb> class Song
.. def to_s
.. "Song"
.. end
.. end
=> nil
irb> song = Song.new()
=> Song
irb> song.to_s
=> "Song"
答案 2 :(得分:1)
在您的情况下,您希望最后一行是:
song = Song.new
puts song.to_s
答案 3 :(得分:0)
是的,to_s
总是将对象转换为字符串。然后由您的程序使用该字符串 - 例如,通过将其写入stdout。
答案 4 :(得分:0)
这是因为上述方法只返回“歌曲”,它不打印它。你的程序应该自己进行打印。