Sebastian Hungerecker
10/29/2007 6:26:00 PM
Lars Ticot wrote:
>> h = Hash.new(Hash.new(0))
> Changing declaration by
> h = Hash.new {|h,k| h[k] = Hash.new(0) }
> makes things ok. What are the difference beetween the two declaration?
There are two differences:
First: The first version executes "Hash.new(0)" once (before the outer
Hash.new is called, since parameters are evaluated before the actual method
call (obviously)) and stores the result as the default value. This means that
if you do something like h[:foo][:chunky] = "bacon" and h[:foo] has not been
assigned before, you will actually change the default value, so h[:bar]
[:chunky] will also be "bacon". The second version just stores the block and
executes it everytime a key that hasn't been assigned before is accessed.
Second: The second version has "h[k] =" in it, so it will not only return the
newly created hash, it will also store it in the outer hash. The first
version won't do that, which means that h will always appear as empty until
you do any actual assignments to it.
HTH,
Sebastian
--
Jabber: sepp2k@jabber.org
ICQ: 205544826