Hash#keys, Hash#values order question

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

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

···

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?

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

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

···

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?