ruby hash autovivification (facets)
ruby
Solution
The standard new method for Hash accepts a block. This block is called in the event of trying to access a key in the Hash which does not exist. The block is passed the Hash itself and the key that was requested (the two parameters) and should return the value that should be returned for the requested key.
You will notice that the `leet` lambda does 2 things. It returns a new Hash with `leet` itself as the block for handling defaults. This is the behaviour which allows `autonew` to work for Hashes of arbitrary depth. It also assigns this new Hash to `hsh[key]` so that next time you request the same key you will get the existing Hash rather than a new one being created.
Problem
Here is a clever trick to enable hash autovivification in ruby (taken from facets): ``` # File lib/core/facets/hash/autonew.rb, line 19 def self.autonew(*args) leet = lambda { |hsh, key| hsh[key] = new( &leet ) } new(*args,&leet) end ``` Although it works (of course), I find it really frustrating that I can't figure out how this two liner does what it does. leet is put as a default value. So that then just accessing `h['new_key']` somehow brings it up and creates `'new_key' => {}` Now, I'd expect `h['new_key']` returning default value object as opposed to evaluating it. That is, `'new_key' => {}` is not automatically created. So how does leet actually get called? Especially with two parameters?