开发者

Ruby's to_s method question (from Axe book 2nd edition)

According to the axe book (2nd edition), we can use to_s as follows.

class Song
  def to_s
    "Song"
  end
end

song = Song.new()
song.to_s

But, it doesn't give me anything, in order to print something to the stdout, I should run

  def to_s
    p "Song"  
  end

Is there any change since the ruby 1.8.2 when the book was 开发者_如何学编程written for? My ruby version info is 1.8.7 for Mac.

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


The Pickaxe book uses a common notation of e.g.

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

to indicate that "Song: My Way--Sinatra (225)" is the value of the expression on the left. However it isn't printed out unless you explictly use a puts.

An appropriate implementation of to_s on an object will return a string representation of that object (e.g. the name for a person or the title and ID for a blog post) but won't actually have any side effects itself (such as outputting something.)

If you use irb, the interactive Ruby interpreter it prints out the value of each expression for you without an explicit puts. e.g.

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


That example might be meant to be typed into a REPL like irb, which would look like this:

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


In your case you would want your last lines to be:

song = Song.new
puts song.to_s


Right, to_s has always just converted the object to a string. It is up to your program to then use that string - for example, by writing it to stdout.


This is because the above method simply returns "song", it doesn't print it. Your program should do the printing itself.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜