Hmm, I meant h[k] not h[h] as I originally posted below...
md = Hash.new { |h,k| h[k] = 0; 3 }
# access undefined key 1
p md[1] # => 3 # returns the block result
p md[1] # => 0 # now we discover the actual default value
It's clear to me exactly what is happening, but I guess my thought was
that this behavior is a bug. If the code that runs the autovivication
block can recognize that the value for the undefined key was set, then
perhaps the block return value should be ignored. I guess it would
require an additional st_lookup after the initial lookup fails.
"Warren Brown" <wkb / airmail.net> wrote in message news:<005101c3719d$c091ca50$670b88cf@warrenpc>...
> alan,
>
> > I was wondering about this behavior:
> >
> > md = Hash.new { |h,k| h[h] = 0; 3 }
> > p md[1] # => 3
> > p md[1] # => 0
> >
> > I understand that the first "p md[1]" is returning
> > the result of the block; is that intentional?
>
> Yes. A clearer example:
>
> md = Hash.new { 3 }
> md[1] = 1
> p md[1] => 1
> p md[2] => 3
> p md => {1=>1}
>
> Remember, the main point of the block is to generate a default value for
> nonexistent keys. The autovivication trick is merely an extension of this
> functionality.
>
> I hope this helps.
>
> - Warren Brown