Я предположил, что ответ на вопрос, который я поднял в комментарии к этому вопросу, "да".
Можно использовать Enumerable # уменьшать (a.k.a. inject
):
def undig(*keys, value)
keys[0..-2].reverse_each.reduce (keys.last=>value) { |h,key| { key=>h } }
end
undig(:first, :second, [1,2,3,4])
#=> {:first=>{:second=>[1, 2, 3, 4]}}
или рекурсия:
def undig(*keys, value)
keys.empty? ? value : { keys.first=>undig(*keys.drop(1), value) }
end
undig(:first, :second, [1,2,3,4])
#=> {:first=>{:second=>[1, 2, 3, 4]}}