[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Hash#keys, Hash#values order question

Ronald Fischer

8/23/2007 9:35:00 AM

Let h be a Hash. Calculating the arrays

k=h.keys
v=h.values

under the assumption that h is not modified
in between, is it guaranteed that for all
indices n

h[k[n]]==v[n]

i.e. that Hash#values delivers the values
in the same order than Hash#keys delivers
the respective keys?

When playing around, I found this always
the case, but can I rely on it?

Ronald
--
Ronald Fischer <ronald.fischer@venyon.com>
Phone: +49-89-452133-162

2 Answers

Robert Dober

8/23/2007 10:12:00 AM

0

On 8/23/07, Ronald Fischer <ronald.fischer@venyon.com> wrote:
> Let h be a Hash. Calculating the arrays
>
> k=h.keys
> v=h.values
>
> under the assumption that h is not modified
> in between, is it guaranteed that for all
> indices n
>
> h[k[n]]==v[n]
>
> i.e. that Hash#values delivers the values
> in the same order than Hash#keys delivers
> the respective keys?
>
> When playing around, I found this always
> the case, but can I rely on it?
Looks like for 1.8.6, I just had a quick look at the sources and both use
rb_hash_foreach, just with a different extractor function.
Now I cannot be sure if some internal events like GC might change the
structure of the underlying hash that could lead to different results,
would surprise me though...

HTH
Robert
--
[...] as simple as possible, but no simpler.
-- Attributed to Albert Einstein

Robert Klemme

8/23/2007 1:22:00 PM

0

2007/8/23, Ronald Fischer <ronald.fischer@venyon.com>:
> Let h be a Hash. Calculating the arrays
>
> k=h.keys
> v=h.values
>
> under the assumption that h is not modified
> in between, is it guaranteed that for all
> indices n
>
> h[k[n]]==v[n]
>
> i.e. that Hash#values delivers the values
> in the same order than Hash#keys delivers
> the respective keys?
>
> When playing around, I found this always
> the case, but can I rely on it?

If you need them in the same order, then the safest method is to
access them in one iteration, like:

irb(main):001:0> ha={:foo=>1, :bar=>2, :baz=>3}
=> {:foo=>1, :bar=>2, :baz=>3}
irb(main):004:0> keys, values = ha.inject([[],[]]) {|(ke,va),(k,v)|
[ke << k, va << v]}
=> [[:foo, :bar, :baz], [1, 2, 3]]
irb(main):005:0> keys
=> [:foo, :bar, :baz]
irb(main):006:0> values
=> [1, 2, 3]

HTH

robert