Вы можете использовать блочную форму Hash.new
для предоставления пустого хэша в качестве значения по умолчанию:
h = Hash.new { |h,k| h[k] = { }; h[k].default_proc = h.default_proc; h[k] }
И тогда это происходит:
>> h[:this][:that] = 6
# h = {:this=>{:that=>6}}
>> h[:other][:that] = 6
# {:this=>{:that=>6}, :other=>{:that=>6}}
>> h[:thing][:that] = 83724
# {:this=>{:that=>6}, :other=>{:that=>6}, :thing=>{:that=>83724}}
Забавный default_proc
материал в блоке разделяет блок генерации значений основного хеша по умолчанию с подхешами, так что они тоже автоматически оживляются.
Кроме того, убедитесь, что выне делайте этого:
h = Hash.new({ })
для предоставления хэша в качестве значения по умолчанию, есть некоторое объяснение, почему бы не указать в этом ответе .