From: Robert Klemme Date: 2010-02-24T21:03:48+09:00 Subject: Re: Referring to Hash and Array Elements 2010/2/24 Saeed Bhuta : > Hi All, > > I am a beginner to Ruby. Currently I am working with Hashes and Arrays. > > I have a loop where the code saves several objects into a Hash. > Everytime the loop is run the objects in the Hash are overwritten, > therefore I append the objects into an Array so that data is not lost. > > #begining of loop ommitted > >                trainHash = {} >                trainHash['order'] = tubeOrder >                trainHash['destination'] = destination >                trainHash['currentLocation'] = currentLocation >                trainHash['dueIn'] = dueInMinsValue >                #trainHash['dueintimestamp'] = dueInTimestamp.to_s > >                trainArray << trainHash >             end > > From what I have read so far, Arrays are indexed by an integer with > indexing starting at '0'. > > So for example, if the above loop was run twice; the number of objects > in the trainArray would be two and referred using [0] for the first > object and [1] for the second object. > > My question is, is it possible to refer the elements as they were stored > in the Hash? I am not sure I understand that question. > For example, I want the code to return the value of the > 'order' field in the second object in the trainArray. Like this? second_order = train_array[1]['order'] > If not, is it possible to dynamically generate a key for the hash > everytime the loop is run so that the objects are not overwritten in the > hash? Yes, of course. There are also other options. It depends how you want to further process the data. To me it looks like all values in the Hash belong to a single record. In this case I would stick with the two level approach, i.e. have an Array of records (Hashes or other types). If you just want to collect all individual values per key, you can use Arrays as Hash values, e.g. train_hash = Hash.new {|h,k| h[k] = []} # loop train_hash['order'] << tube_order train_hash['destination'] << destination train_hash['currentLocation'] << current_location train_hash['dueIn'] << due_in_mins_value #train_hash['dueintimestamp'] << due_in_timestamp.to_s # end loop Btw, I changed names to match the usual convention in Ruby. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/