Ross Bamford
12/9/2005 1:52:00 PM
On Fri, 09 Dec 2005 21:48:24 +0900, Steve Litt wrote:
> On Friday 09 December 2005 05:57 am, Ross Bamford wrote:
>> Hi,
>>
>> I have a couple more questions. Hopefully they're not so dumb this time.
>>
>> 1) I need a hash that maintains insertion order. In Java, I'd use
>> LinkedHashMap. Does Ruby have one?
>
> I've only done Ruby for 9 days now, but from the reading I've done, no. It
> would be easy enough to insert the key in an array at the same time you
> insert the key=>value in a hash. You could even make a class that does it all
> for you.
>
(I'm a relative newbie too :) And just loving Ruby more and more!)
I think I found something in facets that does the trick, but I've not
gotten to looking at it yet so I'm not certain. But anyway, I think a
variant of your suggestion is more suitable.
> Perhaps there's a better way, but that's one I'm sure would work.
>
> By the way, why do you need initial insertion order? Do you ever need to look
> up by the key value? If not, why not use an array of hashes, or an array of 2
> element arrays?
>
The idea was to make a Hash that accepted Regex keys, but allowed you to
look for them by a string, using backrefs in the value:
class RxHash < Hash
def [](key)
md = nil
if v = self.detect { |k,v| md = /^#{k}$/.match(key) }
v[1].gsub(/\$(\d)/) { md[$1.to_i] }
end
end
end
You can then have mappings like /123([a-z]+)/ => '321$1'. It was for
mapping file extensions. It works, but if there are multiple matches you
get one pretty much at random.
Thinking more on it, though, I see that the Hash is probably leading me
down the wrong path anyway, it's better done with arrays as you suggest.
I think I can have an array of two element arrays and use 'map' for easy
access.
Thanks for the reply,
Ross
--
Ross Bamford - rosco@roscopeco.remove.co.uk
"\e[1;31mL"