Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Question on setting up a class and searching on objects (http://www.velocityreviews.com/forums/t832328-question-on-setting-up-a-class-and-searching-on-objects.html)

Dark Ambient 08-11-2006 12:47 PM

Question on setting up a class and searching on objects
 
I'm working from Ruby for Rails book but want to try and just
replicate some of the examples in Ruby alone.
One method in particular is called whole_name and would give the user
the ability to search a list by first_name, middle_name, or last_name.

So I went ahead and set up my class and objects, but have a few
questions (below code)
class Composer

def listcomp (first_name, middle_name, last_name)
f = first_name
m = middle_name
l = last_name
end

def whole_name
first_name + " " +
(if middle_name then middle_name + " " else "" end) +
last_name
end
end

comp1 = Composer.new
comp2 = Composer.new
comp3 = Composer.new
comp4 = Composer.new
comp5 = Composer.new

comp1.listcomp("ludwig","van","bethoven")
comp2.listcomp("wolfgang","amadeus","mozart")
comp3.listcomp("franz", "joseph", "hayden")
comp4.listcomp("George", "frederic", "Handel")
comp5.listcomp("Johann", "sebastian", "bach")

Question - I'm having a problem calling to the class method
whole_name. The method is defined without any arguments so how could
it be called ?

Question - Did I set up the class correctly , defining the new object
outside of the class definition ? And would it be better to create an
array (multidimensional) for the composers instead of initializing
each one seperately ? (If this question makes sense)

Apologies if this question is sort of lame.

TIA
Stuart


James Edward Gray II 08-11-2006 01:47 PM

Re: Question on setting up a class and searching on objects
 
On Aug 11, 2006, at 7:47 AM, Dark Ambient wrote:

> I'm working from Ruby for Rails book but want to try and just
> replicate some of the examples in Ruby alone.
> One method in particular is called whole_name and would give the user
> the ability to search a list by first_name, middle_name, or last_name.


If you want to make a method to search the the individual composers,
you will need to get them into some data structure (like an Array)
where you can scan through them.

> class Composer
>
> def listcomp (first_name, middle_name, last_name)
> f = first_name
> m = middle_name
> l = last_name
> end


What are you intending this method to do? Currently, it doesn't do
anything meaningful:

1. first_name, middle_name, and last_name are accepted as arguments
2. Each of those is assigned to another local variable
3. All six local variables are discarded as the method exits

> def whole_name
> first_name + " " +
> (if middle_name then middle_name + " " else "" end) +
> last_name
> end
> end


This method doesn't work because it uses local variables that don't
exist in this method. I believe this is your hang-up.

Inside a class, you keep data around by putting it into instance
variables (those start with an @ symbol). All methods of the class
can access the instance variables for the current object.

See if this helps explain things:

>> class Name
>> def initialize(first, last, middle = nil)
>> # assign these local variables to instance variables...

?> @first = first
>> @last = last
>> @middle = middle
>> end
>>

?> # create methods to read those instance variables...
?> attr_reader :first, :last, :middle
>>

?> def full
>> [@first, @middle, @last].join(" ").squeeze(" ")
>> end
>> end

=> nil
>> james = Name.new("James", "Gray", "Edward")

=> #<Name:0x31a5e0 @last="Gray", @first="James", @middle="Edward">
>> james.last

=> "Gray"
>> james.full

=> "James Edward Gray"
>> dana = Name.new("Dana", "Gray")

=> #<Name:0x314c44 @last="Gray", @first="Dana", @middle=nil>
>> dana.middle

=> nil
>> dana.full

=> "Dana Gray"

> comp1 = Composer.new
> comp2 = Composer.new
> comp3 = Composer.new
> comp4 = Composer.new
> comp5 = Composer.new
>
> comp1.listcomp("ludwig","van","bethoven")
> comp2.listcomp("wolfgang","amadeus","mozart")
> comp3.listcomp("franz", "joseph", "hayden")
> comp4.listcomp("George", "frederic", "Handel")
> comp5.listcomp("Johann", "sebastian", "bach")


Here's another idea:

>> composers = [ %w[ludwig van beethoven],

?> %w[wolfgan amadeus mozart],
?> %w[franz joseph hayden],
?> %w[george frederic handel],
?> %w[johann sebastian bach] ].map do |f, m, l|
?> Name.new(f, m, l)
>> end

=> [#<Name:0x356040 @last="van", @first="ludwig",
@middle="beethoven">, #<Name:0x35602c @last="amadeus",
@first="wolfgan", @middle="mozart">, #<Name:0x356018 @last="joseph",
@first="franz", @middle="hayden">, #<Name:0x356004 @last="frederic",
@first="george", @middle="handel">, #<Name:0x355ff0
@last="sebastian", @first="johann", @middle="bach">]

> Question - I'm having a problem calling to the class method
> whole_name. The method is defined without any arguments so how could
> it be called ?


whole_name() is not a class method, it is an instance method. You
know this because it is called on instances of the class, not the
class itself (new() is a class method).

I hope my examples above cleared up calling the methods.

> Question - Did I set up the class correctly , defining the new object
> outside of the class definition ? And would it be better to create an
> array (multidimensional) for the composers instead of initializing
> each one seperately ? (If this question makes sense)


See above.

Hope that helps.

James Edward Gray II



Dark Ambient 08-11-2006 02:19 PM

Re: Question on setting up a class and searching on objects
 
James,
Thank you for the explanation and example. Ran through you code in
irb so the next step is implementing my method for a search function.
Hopefully I will only be back to say I've figured it out.

No help for now though.

Stuart

On 8/11/06, James Edward Gray II <james@grayproductions.net> wrote:
> On Aug 11, 2006, at 7:47 AM, Dark Ambient wrote:
>
> > I'm working from Ruby for Rails book but want to try and just
> > replicate some of the examples in Ruby alone.
> > One method in particular is called whole_name and would give the user
> > the ability to search a list by first_name, middle_name, or last_name.

>
> If you want to make a method to search the the individual composers,
> you will need to get them into some data structure (like an Array)
> where you can scan through them.
>
> > class Composer
> >
> > def listcomp (first_name, middle_name, last_name)
> > f = first_name
> > m = middle_name
> > l = last_name
> > end

>
> What are you intending this method to do? Currently, it doesn't do
> anything meaningful:
>
> 1. first_name, middle_name, and last_name are accepted as arguments
> 2. Each of those is assigned to another local variable
> 3. All six local variables are discarded as the method exits
>
> > def whole_name
> > first_name + " " +
> > (if middle_name then middle_name + " " else "" end) +
> > last_name
> > end
> > end

>
> This method doesn't work because it uses local variables that don't
> exist in this method. I believe this is your hang-up.
>
> Inside a class, you keep data around by putting it into instance
> variables (those start with an @ symbol). All methods of the class
> can access the instance variables for the current object.
>
> See if this helps explain things:
>
> >> class Name
> >> def initialize(first, last, middle = nil)
> >> # assign these local variables to instance variables...

> ?> @first = first
> >> @last = last
> >> @middle = middle
> >> end
> >>

> ?> # create methods to read those instance variables...
> ?> attr_reader :first, :last, :middle
> >>

> ?> def full
> >> [@first, @middle, @last].join(" ").squeeze(" ")
> >> end
> >> end

> => nil
> >> james = Name.new("James", "Gray", "Edward")

> => #<Name:0x31a5e0 @last="Gray", @first="James", @middle="Edward">
> >> james.last

> => "Gray"
> >> james.full

> => "James Edward Gray"
> >> dana = Name.new("Dana", "Gray")

> => #<Name:0x314c44 @last="Gray", @first="Dana", @middle=nil>
> >> dana.middle

> => nil
> >> dana.full

> => "Dana Gray"
>




All times are GMT. The time now is 05:48 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.