Hashes in 1.9 index

Since hashes in 1.9 retain their insert order, is there a built in way
to get values by index as well as key?

For example:
h = { a: 17, b: 18, c: 19 }

puts h[1]
=> 19

Obviously that can’t work, but there may be some other way I haven’t
found by looking through the docs? At the moment I’m using this:

class Hash
def by_index( n )
self.each_with_index { |item, index| break item if index == n }
end
end

Just wondering.

Regards,
Iain

Iain B. wrote:

Since hashes in 1.9 retain their insert order, is there a built in way
to get values by index as well as key?

For example:
h = { a: 17, b: 18, c: 19 }

puts h[1]
=> 19

Obviously that can’t work, but there may be some other way I haven’t
found by looking through the docs? At the moment I’m using this:

class Hash
def by_index( n )
self.each_with_index { |item, index| break item if index == n }
end
end

Just wondering.

Regards,
Iain

I think the closest to what you want is Hash#to_a

Just like
irb(main):011:0> h = Hash[:a, 1, :b, 2, :c, 3]
=> {:a=>1, :b=>2, :c=>3}
irb(main):012:0> h.to_a[0][1]
=> 1
irb(main):013:0>

On 19 Aug 2010, at 06:00, Paul H. wrote:

Thanks, I’ll see how that pans out.

Regards,
Iain

Iain B. wrote:

Since hashes in 1.9 retain their insert order, is there a built in way
to get values by index as well as key?

No - I expect it just keeps them on a global linked list, in addition to
the linked list for each hash bucket.

On 08/18/2010 09:28 PM, Iain B. wrote:

Since hashes in 1.9 retain their insert order, is there a built in way to get values by index as well as key?

For example:
h = { a: 17, b: 18, c: 19 }

puts h[1]
=> 19

Not much better than using #each_with_index or #to_a:

h = { a: 17, b: 18, c: 19 }
=> {:a=>17, :b=>18, :c=>19}

h[h.keys[1]]
=> 18