Вот хитрый трюк для включения автовификации хэша в ruby (взятый из фасетов):
# 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
Хотя это работает (конечно), меня действительно расстраивает то, что я не могу понять, как эти два лайнера делают то, что делают.
leet ставится как значение по умолчанию. Так что тогда простой доступ к h['new_key']
каким-то образом вызывает его и создает 'new_key' => {}
Теперь я ожидаю, что h['new_key']
вернет объект значения по умолчанию, а не оценит его. То есть 'new_key' => {}
не создается автоматически. Так как же на самом деле вызывается leet? Особенно с двумя параметрами?