[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Newb question: Printing a class.

Brian A.

8/28/2008 5:00:00 PM

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/...

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.source...) for my
IDE.

I am currently on this page of the tutorial
(http://www.math.umd.edu/~dcarrera/ruby/0.3/chp_04/cla...) 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-....

5 Answers

Shashank Agarwal

8/28/2008 5:13:00 PM

0

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-....

Matthias Reitinger

8/28/2008 5:13:00 PM

0

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-....

Brian A.

8/28/2008 5:24:00 PM

0

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-....

Adam Shelly

8/28/2008 5:44:00 PM

0

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?
>
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

Brian A.

8/28/2008 6:05:00 PM

0

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-....