Inject работает хорошо здесь:
hash = "this_is_a_test".split('_').reverse.inject("final value") { |h, s| {s => h} }
Это возвращает:
{"this"=>{"is"=>{"a"=>{"test"=>"final value"}}}}
и:
hash['this']['is']['a']['test']
=> "final value"
Объяснение здесь является то, что каждая итерация Inject возвращает хэш это конта вставляет текущую строку в качестве ключа и предыдущий хеш в качестве значения, поэтому каждый новый ключ содержит рекурсивно все хэши до этой точки, включая самое глубокое значение, которое передается как аргумент впрыска.
Вот почему массив ключей нужно перевернуть, потому что хэш создается из наизнанку.
Редактировать: Я считаю, что я не понял вопрос правильно.
Вы на самом деле имели доступ к существующему рекурсивному хэшу.
Предполагая, что хэш было построено с помощью моего предыдущего метода, доступ сокровенного значения может быть достигнут с Inject тоже:
"this_is_a_test".split('_').inject(hash) { |h,v| h[v] }
=> "final value"
отметить также, что рубин 2,3 реализует новый метод Hash#dig
, который делает именно это, в безопасный способ:
path = "this_is_a_test".split('_')
hash.dig(*path) # => "final value"
Да, моя ошибка, я действительно имею в виду хэш. – Gary
Вы случайно пытаетесь реализовать трю? – SirDarius