Javier Valencia wrote: > dblack / wobblini.net wrote: > > > Hi -- > > > > On Tue, 25 Jul 2006, Javier Valencia wrote: > > > >> I have this piece of simple code: > >> > >> ---------------------------------------------- > >> def foo > >> return 5 > >> end > >> > >> a = {:gr => false, :und => false, :det => true, :sta => false, :inv > >> => false} > >> puts a.inspect > >> ---------------------------------------------- > >> > >> when I execute it i get a totally unordered hash: > >> > >> ---------------------------------------------- > >> ruby pro.rb > >> {:inv=>false, :gr=>false, :und=>false, :det=>true, :sta=>false} > >> ---------------------------------------------- > >> > >> Now, i delete the foo function from the code (the foo function don't > >> do nothing at all), and i get a well ordered hash: > >> > >> ---------------------------------------------- > >> ruby pro.rb > >> {:gr=>false, :und=>false, :det=>true, :sta=>false, :inv=>false} > >> ---------------------------------------------- > >> > >> > >> What's happening? all my code is behaving wrong because of that. > > > > > > Hashes are unordered. If you need an ordered collection, you'll need > > to use an array. > > > > > > David > > > > Oh my god, i didn't know it, sorry. Is that a missing feature? No. What language has ordered hashes? When you say a = {:gr => false, :und => false, :det => true, :sta => false, :inv => false} you are saying that you want to access the values in this fashion: a[:und] So the order in which they are stored is irrelevant. If you want to access them this way a[1] then you set them up like this [ false, false, true, false, false ] If you want to get a sequence of values in a certain order: a.values_at( :und, :det, :sta ) If you want to have your cake and eat it too, you could use an association list: >> as = [[:foo,22], [:bar,33], [:baz,44]] => [[:foo, 22], [:bar, 33], [:baz, 44]] >> as.assoc(:bar) => [:bar, 33] >> as.rassoc( 44 ) => [:baz, 44] >> as[0] => [:foo, 22] If the list has a large number of elements, access will be slow.