Arrays and Hashes

In “Why’s poignant guide to Ruby” it mentions the following:

Unlike arrays, the items in a hash are not kept in a specific order.

Can you clarify on this?

Thanks.

Arrays have order because each one represents a sequence of objects.
This
guarantees that for a given array you’ll get consistent results using
the
“each” method:

a = [1,2,3]
a.each {|n| puts n} #you’ll always get 1 2 and 3 in that order

Hashes, on the other hand, are more about letting you map some object,
the
key, to another object, the value. A single hash can have several of
these
mappings, but the “order” of the mappings is insignificant and therefore
not
necessarily consistent.

{:a => 1, :b => 2, :c => 3} == {:b => 2, :a => 1, :c => 3} # true

Although all of the the “each” methods provided by a hash (“each”,
“each_pair”, etc.) return items in a sequence, that sequence isn’t
guaranteed to be the same every time.

Hope that helps.

-Jake

On Mon, Jul 12, 2010 at 8:22 AM, Abder-rahman Ali <

On Jul 12, 6:22 am, Abder-rahman Ali [email protected]
wrote:

Unlike arrays, the items in a hash are not kept in a specific order.

Note that this is no longer true in Ruby 1.9. Insertion order,
including initialization, is maintained for Hashes:

Slim2:~ phrogz$ irb --simple-prompt

h = { a:1, z:7 }
=> {:a=>1, :z=>7}
h[:f] = 14; h[:b] = 99
=> 99
h[‘last’] = “this one”
=> “this one”
h[-1] = “really last”
=> “really last”
h.each{ |k,v| p [k,v] }
[:a, 1]
[:z, 7]
[:f, 14]
[:b, 99]
[“last”, “this one”]
[-1, “really last”]
=> {:a=>1, :z=>7, :f=>14, :b=>99, “last”=>“this one”, -1=>“really
last”}
h.keys
=> [:a, :z, :f, :b, “last”, -1]

I may not getting your point clear. What is it not applicable to Ruby
1.9 from what Jake said?

Ruby 1.9 added a constraint that whenever you query for an iterator using
any of the Hashes each* methods, you’ll always get the objects in the
same
order that they were inserted into that hash. Prior to that there were
no
promises about the order the elements would be yielded by the iterator.

-Jake

Gavin K. wrote:

On Jul 12, 6:22�am, Abder-rahman Ali [email protected]
wrote:

Unlike arrays, the items in a hash are not kept in a specific order.

Note that this is no longer true in Ruby 1.9. Insertion order,
including initialization, is maintained for Hashes:

Slim2:~ phrogz$ irb --simple-prompt

h = { a:1, z:7 }
=> {:a=>1, :z=>7}
h[:f] = 14; h[:b] = 99
=> 99
h[‘last’] = “this one”
=> “this one”
h[-1] = “really last”
=> “really last”
h.each{ |k,v| p [k,v] }
[:a, 1]
[:z, 7]
[:f, 14]
[:b, 99]
[“last”, “this one”]
[-1, “really last”]
=> {:a=>1, :z=>7, :f=>14, :b=>99, “last”=>“this one”, -1=>“really
last”}
h.keys
=> [:a, :z, :f, :b, “last”, -1]

Thanks a lot Gavin.

I may not getting your point clear. What is it not applicable to Ruby
1.9 from what Jake said?

On 2010-07-12 12:01:20 -0700, Jacob M. said:

-Jake

In practice, hash order (for 1.8) is deterministic per machine,
meaning the hash will enumerate in the same order each time for you,
but not in the same order as someone else’s machine.

That said, this must not be relied on (after all, it isn’t in the
spec). One should not expect hashes to be ordered, and any code in Ruby
1.8 that treats the order of a hash as significant is incorrect.

Jacob M. wrote:

I may not getting your point clear. What is it not applicable to Ruby
1.9 from what Jake said?

Ruby 1.9 added a constraint that whenever you query for an iterator using
any of the Hashes each* methods, you’ll always get the objects in the
same
order that they were inserted into that hash. Prior to that there were
no
promises about the order the elements would be yielded by the iterator.

-Jake

I got you Jake. Thanks.

Yes. An orderedhash object is present in libraries such as activesupport
because this feature can be useful. Its not very often that you need it
ordered but every now and then it can come in handy.

I sometimes wish ruby had the rich tapestry of collection types that
smalltalks such as gemstone avail their users of. For example, a bag is
an unordered collection. Some collections don’t allow multiples, others
are faster… Etc

Blog: http://random8.zenunit.com/
Twitter: http://twitter.com/random8r
Learn: http://sensei.zenunit.com/
New video up now at http://sensei.zenunit.com/ real fastcgi rails deploy
process! Check it out now!