On 03/20/2010 10:07 PM, Glenn Ritz wrote:
> Hi,
> 
> I have an array of objects, and the objects have some attributes.  I'd
> like to be able to modify selected elements in the array based on any of
> those attributes.
> 
> For example, suppose I have a have an array of Albums, like this:
> 
> class Album
>   attr_reader :name, :band, :like
>   attr_writer :like
> 
>   def initialize(name, band)
>     @name = name
>     @band = band
>     @like = nil
>   end
> end
> 
> albums = []
> albums << Album.new("Exile on Main Street", "The Rolling Stones")
> albums << Album.new("St. Peppers", "The Beatles")
> albums << Album.new("The White Album", "The Beatles")
> 
> I want to be able to selectively modify the elements of the albums array
> based on, for example, the band.  In other words, I want to be able to
> able to change the like instance variable in each object to true with a
> method.
> 
> Here's what I have so far:
> 
> puts albums.collect { |a| a.like = true if a.band == "The Beatles";
> a}.inspect
> 
> Using collect like this works, but it seems awkward to me to have to
> iterate through the whole array just to find the element (or elements)
> that I want to change.  I'd like to be able just to select the elements
> I want, make the changes, and leave the rest of the elements unchanged.
> Is there a better way to do this?

There is a different way but it's not really better because now you 
iterate the elements that you want to change twice:

albums.select {|a| a.band == "The Beatles"}.each {|a| a.like = true}

If your Albums are stored in this single Array only you have no other 
choice than to iterate all.  If you want mo re efficient operation then 
you need to create a more complex data structure which non only manages 
the list of Albums but also one or more indexes (typically Hashes) 
depending on your typical queries.

Kind regards

	robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/