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.

···

--
Posted via http://www.ruby-forum.com/.

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 < abder.rahman.ali@gmail.com> wrote:

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.
--
Posted via http://www.ruby-forum.com/\.

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]

···

On Jul 12, 6:22 am, Abder-rahman Ali <abder.rahman....@gmail.com> wrote:

Gavin Kistner wrote:

···

On Jul 12, 6:22�am, Abder-rahman Ali <abder.rahman....@gmail.com> > 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?

--
Posted via http://www.ruby-forum.com/\.

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

Jacob Mitchell 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.

···

--
Posted via http://www.ruby-forum.com/\.

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.

···

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

[Note: parts of this message were removed to make it a legal post.]

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

--
Rein Henrichs

http://reinh.com

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!

···

On 13/07/2010, at 9:40 AM, Rein Henrichs <reinh@reinh.com> wrote:

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

[Note: parts of this message were removed to make it a legal post.]

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

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.

--
Rein Henrichs
http://puppetlabs.com
http://reinh.com