> From: nosuzuki / e-mail.ne.jp [mailto:nosuzuki / e-mail.ne.jp]On Behalf Of [...] > You only type less if you're doing it this way *once*. If your > program is filled with things like this ... > > h = {'a'=>{'b'=>{'c'=>'xxx'}}} > > .. you end up typing a lot more than if you instantiate one `HashMD' > object and then use lots of constructs like this: > > h['a']['b']['c'] = 'xxx' > > However, in my opinion, saving a few keystrokes isn't very important > at all. To me, the advantage of the latter form is that it's much > easier to read, understand, and maintain. I guess that's a matter of taste (I was sort of wandering if h['a']['b']['c'] = 'xxx' should result {'c'=>{'b'=>{'a'=>'xxx'}}} or {{{'a'=>'b'} => 'c'}=>'xxx'} etc. ) > > Also, to me, a good idea would be to have some sort of mixin that can > be included in Hash that can add a `get' and `set' method that look > something like this: > > h.get('a','b','c') > > h.set('a','b','c','xxx') > > The `get' method would return nil (or perhaps throw an exception) if a > non-existent node is being referenced; and the `set' method would > create the internal structure as needed. but I agree that you probably want a short cut if you really use this very often - I guess you want (you could use inject for this) something like --------- module MultiHash def lset! (*parms) raise TypeError.new 'lset - not enough parameters' if (nl = parms.length - 2)< 0 tmp = self for i in 0...nl do if (minitmp= tmp[parms[i]]).kind_of? Hash (tmp = minitmp) else minitmp= parms.last nl.downto(i+1) { |j| minitmp={parms[j] => minitmp} } tmp[parms[i]] = minitmp return self end end if (tmp.key? parms[nl]) && (parms.last == tmp[parms[nl]]) return nil else tmp[parms[nl]] = parms.last return self end end end class Hash include MultiHash end h ={} p h.lset!('a','b','c','x') p h.lset!('a','b','c','x') p h.lset!('a','b','C','x') p h.lset!('a','B','c','x') Christoph