Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Arrays and Hashes

Reply
Thread Tools

Arrays and Hashes

 
 
Abder-rahman Ali
Guest
Posts: n/a
 
      07-12-2010
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/.

 
Reply With Quote
 
 
 
 
Jacob Mitchell
Guest
Posts: n/a
 
      07-12-2010
[Note: parts of this message were removed to make it a legal post.]

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 <
http://www.velocityreviews.com/forums/(E-Mail Removed)> 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/.
>
>


 
Reply With Quote
 
 
 
 
Phrogz
Guest
Posts: n/a
 
      07-12-2010
On Jul 12, 6:22*am, Abder-rahman Ali <(E-Mail Removed)>
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]
 
Reply With Quote
 
Abder-rahman Ali
Guest
Posts: n/a
 
      07-12-2010
Gavin Kistner wrote:
> On Jul 12, 6:22´┐Żam, Abder-rahman Ali <(E-Mail Removed)>
> 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/.

 
Reply With Quote
 
Jacob Mitchell
Guest
Posts: n/a
 
      07-12-2010
[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

 
Reply With Quote
 
Abder-rahman Ali
Guest
Posts: n/a
 
      07-12-2010
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/.

 
Reply With Quote
 
Julian Leviston
Guest
Posts: n/a
 
      07-13-2010
Yes. An orderedhash object is present in libraries such as activesupport bec=
ause this feature can be useful. Its not very often that you need it ordered=
but every now and then it can come in handy.=20

I sometimes wish ruby had the rich tapestry of collection types that smallta=
lks such as gemstone avail their users of. For example, a bag is an unordere=
d collection. Some collections don't allow multiples, others are faster... E=
tc

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 pro=
cess! Check it out now!


On 13/07/2010, at 9:40 AM, Rein Henrichs <(E-Mail Removed)> wrote:

> On 2010-07-12 12:01:20 -0700, Jacob Mitchell said:
>=20
>> [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 usin=

g
>> any of the Hashes each* methods, you'll always get the objects in the sam=

e
>> order that they were inserted into that hash. Prior to that there were n=

o
>> promises about the order the elements would be yielded by the iterator.
>> -Jake

>=20
> In practice, hash order (for 1. is deterministic *per machine*, meaning t=

he hash will enumerate in the same order each time for you, but not in the s=
ame order as someone else's machine.
>=20
> That said, this must not be relied on (after all, it isn't in the spec). O=

ne should not expect hashes to be ordered, and any code in Ruby 1.8 that tre=
ats the order of a hash as significant is incorrect.
>=20
> --=20
> Rein Henrichs
> http://puppetlabs.com
> http://reinh.com
>=20
>=20


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How to make an array of hashes to a single array with all thevalues of these hashes ? kazaam Ruby 12 09-13-2007 01:30 PM
"Pseudo-hashes are deprecated" error and accessing a hash of hashes ernestm@mindspring.com Perl Misc 3 01-31-2006 04:40 AM
using hashes as keys in hashes Steven Arnold Ruby 3 11-23-2005 03:25 PM
Hash of hashes, of hashes, of arrays of hashes Tim O'Donovan Perl Misc 5 10-28-2005 05:59 AM
Hashes of Hashes via subs Ben Holness Perl 8 10-08-2003 06:57 AM



Advertisments