harp:~ > cat a.rb
require 'arrayfields'
a = %w( aaa bbb ccc )
a.fields = %w( a b c )
p a['a'] = a[0]
p a['b'] = a[1]
p a['c'] = a[2]
harp:~ > ruby a.rb
"aaa"
"bbb"
"ccc"
or
harp:~ > cat a.rb
require 'arrayfields'
class HashMaintainingInsertionOrder < ::Array
def initialize
self.fields =
end
end
a = HashMaintainingInsertionOrder::new
a['a'] = 'aaa'
a['b'] = 'bbb'
a['c'] = 'ccc'
p a['a'] = a[0]
p a['b'] = a[1]
p a['c'] = a[2]
harp:~ > ruby a.rb
"aaa"
"bbb"
"ccc"
this works because assigning to non-existent fields appends a key/val pair.
arrayfields is at
http://codeforpeople.com/lib/ruby/arrayfields/
and cross-listed on the raa. you also may want to check out my personal lib,
alib, at
http://codeforpeople.com/lib/ruby/alib/
which contains an OrderedHash impl. use like
require 'alib'
oh = OrderedHash::new
but this only returns keys in order for methods like each - it does not allow
look-up by number __or__ field.
hth.
-a
···
On Mon, 26 Sep 2005, Bob Hutchison wrote:
Hi,
Is there a Hash-like class that maintains insertion order and, ideally, allows 'retrieval' by either key or index? I googled around for this but can't seem to hit on a query string that is useful.
In a perfect implementation I'd be able to do something like:
hash = HashMaintainingInsertionOrder.new
hash["a"] = "aaa"
hash["b"] = "bbb"
hash["c"] = "ccc"
assert_equal(hash["a"], hash[0])
assert_equal(hash["b"], hash[1])
assert_equal(hash["c"], hash[2])
Thanks,
Bob
----
Bob Hutchison -- blogs at <http://www.recursive.ca/hutch/>
Recursive Design Inc. -- <http://www.recursive.ca/>
Raconteur -- <http://www.raconteur.info/>
--
email :: ara [dot] t [dot] howard [at] noaa [dot] gov
phone :: 303.497.6469
Your life dwells amoung the causes of death
Like a lamp standing in a strong breeze. --Nagarjuna
===============================================================================