Question on setting up a class and searching on objects

Discussion in 'Ruby' started by Dark Ambient, Aug 11, 2006.

  1. Dark Ambient

    Dark Ambient Guest

    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
     
    Dark Ambient, Aug 11, 2006
    #1
    1. Advertising

  2. 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
     
    James Edward Gray II, Aug 11, 2006
    #2
    1. Advertising

  3. Dark Ambient

    Dark Ambient Guest

    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 <> 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"
    >
     
    Dark Ambient, Aug 11, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. tim felton
    Replies:
    2
    Views:
    405
    Ray Tayek
    Jan 14, 2004
  2. E11
    Replies:
    1
    Views:
    4,840
    Thomas Weidenfeller
    Oct 12, 2005
  3. 7stud
    Replies:
    11
    Views:
    710
    Dennis Lee Bieber
    Mar 20, 2007
  4. ghoetker
    Replies:
    1
    Views:
    384
  5. stumblng.tumblr
    Replies:
    1
    Views:
    216
    stumblng.tumblr
    Feb 4, 2008
Loading...

Share This Page