[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: hash of hashes

Austin Ziegler

10/3/2003 1:22:00 PM

On Fri, 3 Oct 2003 20:17:50 +0900, Paul Argentoff wrote:
> On Friday 03 October 2003 14:48, Emmanuel Touzery wrote:
>> not sure i understand your question. does this help you?
> Here is my example:
> irb(main):008:0> a = Hash.new(Hash.new(Array.new(2,0)))

This won't work because you're not doing what you're expecting. What
you're saying is that a nil key will return a particular Hash where
nil keys return a particular array.

This would be like saying:

arry = Array.new(2, 0)
hash = Hash.new(arry)
a = Hash.new(hash)

a['foo'] # => hash
a['foo']['bar'] # => arry

What you want is:

a = Hash.new do |h, k|
h[k] = Hash.new do |h1, k1|
h1[k1] = Array.new(2, 0)
end
end

This only works with 1.8 or bettter. Ruby does not auto-vivify
hashes or arrays like Perl. Note further that if you do something
like:

a = Hash.new { |h, k| h[k] = :val; nil }

You will get a perhaps surprising -- but entirely correct -- result:

a['foo'] # => nil
a['foo'] # => :val

When you attempt to access a nonexistant hash key, the default value
is returned. In this case, it's nil. However, in the block you have
also set a side effect of setting the hash key provided to :val, so
the next time you access 'foo', it's no longer nonexistant.

-austin
--
austin ziegler * austin@halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.10.03
* 09.15.49