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

时间:2010-04-12 20:13:56

标签: ruby printing

根据斧头书(第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]

5 个答案:

答案 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)

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