Newb question: Printing a class

Hello, Im new to the forum and new to Ruby, but I have
programmed before. Im reading through this tutorial as my first venture
into Ruby: http://www.math.umd.edu/~dcarrera/ruby/0.3/index.html

I apologize if this is the wrong forum or I break any forum rules in
this post, please let me know if I do!

I am using Eclipse + RDT (http://rubyeclipse.sourceforge.net/) for my
IDE.

I am currently on this page of the tutorial
(http://www.math.umd.edu/~dcarrera/ruby/0.3/chp_04/classes2.html) and I
am having a performing the exercise at the bottom of the page.

Here is the code I have so far:

···

========================================================================
class Address
    attr_accessor :street, :city, :state, :zip
    def initialize
        @street = @city = @state = @zip = ""
    end

    def to_s
        @street + "\n" + \
        @city + "\n" + \
        @state + ", " + @zip
    end
end

class Person
    attr_accessor :first_name, :email
    attr_accessor :last_name, :address
    def initialize
        @first_name = @last_name = @email = ""
        @address = Address.new
    end

    def full_name
        @first_name + " " + @last_name
    end

    def to_s
        @first_name + " " + @last_name + "\n" + \
        @email + "\n"
    end
end

sandy_addr = Address.new
sandy_addr.street = "324 Campus Dr."
sandy_addr.city = "College Park"
sandy_addr.state = "CO"
sandy_addr.zip = "55555"

sandy = Person.new
sandy.first_name = "Sandy"
sandy.last_name = "Kohh"
sandy.address = sandy_addr

If I then run: 'puts sandy.address' it correctly outputs the address.
This bit of code was given to me in the tutorial. However if I type
'puts sandy.person' I get the following error message:
'test_temp1.rb:43: undefined method `person' for #<Person:0x2f2324c>
(NoMethodError)'

I am lost because the def to_s inside the Person class looks exactly
like the def to_s in the Address class. What am I missing or doing
wrong? Thanks in advance!

-Brian
--
Posted via http://www.ruby-forum.com/.

Brian A. wrote:

This bit of code was given to me in the tutorial. However if I type
'puts sandy.person' I get the following error message:
'test_temp1.rb:43: undefined method `person' for #<Person:0x2f2324c>
(NoMethodError)'

This is because you are asking it to find the return value of method
'person', but such a method does not exist. With sandy.address, you
asked for the return value of method 'address'. This basically was
returning the object 'address' for sandy. To get the to_s method in
person, just put -

puts sandy

That should work (not tested).

···

--
Posted via http://www.ruby-forum.com/\.

Hello Brian,

Brian A. wrote:

If I then run: 'puts sandy.address' it correctly outputs the address.
This bit of code was given to me in the tutorial. However if I type
'puts sandy.person' I get the following error message:
'test_temp1.rb:43: undefined method `person' for #<Person:0x2f2324c>
(NoMethodError)'

There is no method called `person` in your Person class. If you want to
print the string representation of `sandy`, just do a `puts sandy`.

Regards,
Matthias

···

--
Posted via http://www.ruby-forum.com/\.

Shashank Agarwal & Matthias Reitinger wrote:

puts sandy

Thank you both that did work, but opened a new issue for me.

When I change the def to_s within the Person class to this (adding the
@address):

···

========================================================================
def to_s
    @first_name + " " + @last_name + "\n" + \
    @email + "\n"
    @address
end

I get this "#<Person:0x2b3340c>", is this because the Person class makes
reference to the Address class, and its the address class has its own
to_s that prints? Should I move the @street + "\n" + \, ...etc to the
Person class from the Address class?

If I change the def a little to this:

========================================================================
def to_s
    @first_name + " " + @last_name + "\n" + \
    @email + "\n"
    @address + "\n"
end

I get a different error message:
"test_temp1.rb:25:in `to_s': undefined method `+' for
#<Address:0x3413f68> (NoMethodError)
  from test_temp1.rb:41:in `puts'
  from test_temp1.rb:41"

Thanks!
--
Posted via http://www.ruby-forum.com/\.

You are right, the Address class does have its own #to_s. The issue
here is that when you type @address, you are not automatically calling
it. You need to do @address.to_s. (The puts method does
automatically call #to_s on its arguments, but it is not recursive).

Also, you probably want a '+' after the @email + "\n". Methods return
the value of the last line, so without you will only return the
address, not the name and email from the previous lines.

-Adam

···

On 8/28/08, Brian A. <judobrian+ruby-forum@gmail.com> wrote:

Shashank Agarwal & Matthias Reitinger wrote:
>
> puts sandy
>

Thank you both that did work, but opened a new issue for me.

When I change the def to_s within the Person class to this (adding the
@address):

========================================================================
def to_s
   @first_name + " " + @last_name + "\n" + \
   @email + "\n"
   @address
end

I get this "#<Person:0x2b3340c>", is this because the Person class makes
reference to the Address class, and its the address class has its own
to_s that prints? Should I move the @street + "\n" + \, ...etc to the
Person class from the Address class?

Adam Shelly wrote:

···

On 8/28/08, Brian A. <judobrian+ruby-forum@gmail.com> wrote:

========================================================================
Person class from the Address class?

You are right, the Address class does have its own #to_s. The issue
here is that when you type @address, you are not automatically calling
it. You need to do @address.to_s. (The puts method does
automatically call #to_s on its arguments, but it is not recursive).

Also, you probably want a '+' after the @email + "\n". Methods return
the value of the last line, so without you will only return the
address, not the name and email from the previous lines.

-Adam

Thank you, that worked great!
--
Posted via http://www.ruby-forum.com/\.