Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Newb question: Printing a class.

Reply
Thread Tools

Newb question: Printing a class.

 
 
Brian A.
Guest
Posts: n/a
 
      08-28-2008
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/ru.../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/.

 
Reply With Quote
 
 
 
 
Shashank Agarwal
Guest
Posts: n/a
 
      08-28-2008
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/.

 
Reply With Quote
 
 
 
 
Matthias Reitinger
Guest
Posts: n/a
 
      08-28-2008
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/.

 
Reply With Quote
 
Brian A.
Guest
Posts: n/a
 
      08-28-2008
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/.

 
Reply With Quote
 
Adam Shelly
Guest
Posts: n/a
 
      08-28-2008
On 8/28/08, Brian A. <(E-Mail Removed)> 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

 
Reply With Quote
 
Brian A.
Guest
Posts: n/a
 
      08-28-2008
Adam Shelly wrote:
> On 8/28/08, Brian A. <(E-Mail Removed)> 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/.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
brochure printing,online yearbook,printing,books printing,publishing elie Computer Support 2 11-27-2010 12:12 PM
brochure printing,online yearbook,printing,books printing,publishing elie Computer Support 0 08-21-2007 05:52 AM
brochure printing,online yearbook,printing,books printing,publishing elie Computer Support 0 08-21-2007 05:50 AM
brochure printing,online yearbook,printing,books printing,publishing elie Computer Support 0 08-21-2007 05:28 AM
brochure printing,online yearbook,printing,books printing,publishing elie Computer Support 0 08-18-2007 10:11 AM



Advertisments