Question on setting up a class and searching on objects

D

Dark Ambient

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
 
J

James Edward Gray II

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:
?> # 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")
=> # said:
james.last => "Gray"
james.full => "James Edward Gray"
dana = Name.new("Dana", "Gray")
=> # said:
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)=> [#<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
 
D

Dark Ambient

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

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:
?> # 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")
=> # said:
james.last => "Gray"
james.full => "James Edward Gray"
dana = Name.new("Dana", "Gray")
=> # said:
dana.middle => nil
dana.full
=> "Dana Gray"
 

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. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top