2015-11-18 3 views
1

У меня есть строка вроде string = "this_is_a_test" и хеш hash. Как преобразовать строку в путь к ключам, чтобы она возвращала значение, расположенное по адресу: hash['this']['is']['a']['test']?Преобразование строки в путь ключей в хеше

Я не хочу просто разбивать строку на массив; Я хочу использовать строку в качестве ключей для доступа к хешу. Ключи уже существуют в хеше.

+0

Да, моя ошибка, я действительно имею в виду хэш. – Gary

+0

Вы случайно пытаетесь реализовать трю? – SirDarius

ответ

5

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" 
-1

вы ищете String.split() функции

var array = "this_is_a_test".split('_'); 
+0

Нет, это не сделало бы этого. Это просто создаст массив из строки. Но я хочу использовать строку как ключи. – Gary

0

может быть что-то вроде этого?

keys = ["a", "b", "c"] 
    values = [1, 2, 3] 
    zipped = keys.zip(values) 
    => [["a", 1], ["b", 2], ["c", 3]] 
    Hash[zipped] 
    => {"a"=>1, "b"=>2, "c"=>3} 
+0

Нет, это не дает ключи от строки. – Gary

Смежные вопросы