with and without Song#to_s again

Discussion in 'Ruby' started by chen li, Dec 30, 2006.

  1. chen li

    chen li Guest

    Hi all,

    I posted a similar question a short time ago. But I
    don't think the replies help me understand the
    behaviors. So I post a short version( sorry if it
    bothers you again).

    I have the following script. I don't call Song#to_s in
    my script but I can print all the attributes of a
    song. Why is that?

    Thanks,

    Li

    #########
    class Song
    def initialize(name,artist,duration)
    @name=name
    @artist=artist
    @duration=duration
    end
    #attr_reader :name, :artist, :duration

    def to_s
    "#@name\t#@artist\t\t#@duration"
    end
    end


    s=Song.new('song1','author1','20')
    puts s

    ######output

    __________________________________________________
    Do You Yahoo!?
    Tired of spam? Yahoo! Mail has the best spam protection around
    http://mail.yahoo.com
     
    chen li, Dec 30, 2006
    #1
    1. Advertisements

  2. As s is not a String (that is not s.is_a? String), it is converted
    into string by puts. That exactly means your method to_s is called for
    doing so.

    Vince
     
    Vincent Fourmond, Dec 30, 2006
    #2
    1. Advertisements

  3. chen li

    Phrogz Guest

    chen li, you can find this answer yourself.
    1) Open a console and type:
    ri Kernel.puts

    2) See that it says that it's the same as $stdout.puts. Type:
    ri IO.puts

    3) See that it says that it does the same thing as print does. Type:
    ri IO.print

    4) See that it tells you that it calls the to_s method of any objects
    that aren't strings.
     
    Phrogz, Dec 30, 2006
    #3
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.