2014-11-20 3 views
0

У меня есть вложенный хэш следующий образа:Доступ к вложенным хэш с использованием переменных

someVar = { key1: { key2: 'value' } } 

я могу получить доступ к значению, используя его таким образом:

someVar[:key1][:key2] 

Как бы я к нему доступу с помощью переменного ?

hashObj = { key1: { key2: 'value' } } 
oneKey = "key1" 
twoKey = "key2" 

puts hashObj[:key1]   # Works 
puts hashObj[:key1][:key2]  # Works 

puts hashObj[oneKey]   # Blank 
puts hashObj[oneKey][twoKey] # Error 

Уверен, что в этом вопросе есть дубликат этого вопроса, но я не могу найти его.

+0

@The Tin Man Любая причина, почему вы положили в такой небольшой редактировать? Не делает вопрос более или менее ясным. –

+0

Редактирование сделало формулировку более прямой и зафиксировала некоторые грамматические ошибки. Stack Overflow стремится быть похожим на Википедию проблем программирования и решений. Грамматика имеет значение, как и лаконичность. Людям нравится быть дружелюбным, как будто SO - это BBS или чат, но это не так. Вместо этого, это более доброжелательная и мягкая энциклопедия. –

+0

@theTinMan Не было никаких проблем с грамматикой, и вопрос не был косвенным (на мой взгляд). Вы можете отредактировать, как вы себя чувствуете. –

ответ

4

Ваши ключи являются символами, и вы пытаетесь получить к ним доступ с помощью строк. Включите их в символы:

puts hashObj[oneKey.to_sym][twoKey.to_sym] 
1

Вы могли бы найти это удобно, чтобы написать небольшой метод, чтобы извлечь нужные значения:

def get_val(h, *keys) 
    keys.reduce(h) do |h,k| 
    v = h[k] 
    return v unless v.is_a? Hash 
    v 
    end 
end 

h = { key1: { key2: 'cat' }, key3: { key4: { key5: 'dog' } } } 

get_val(h, :key1, :key2)  #=> "cat" 
get_val(h, :key3, :key4, :key5) #=> "dog" 

Некоторые проверки ошибок будет необходимо, следует, например,

get_val(h, :key1, :key2, :key3) 

введен.

Edit: С Рубином 2.3+ вы можете улучшить это с помощью Hash#dig:

def get_val(h, *keys) 
    h.dig *keys 
end 

get_val(h, :key3, :key4, :key5) 
    #=> "dog" 
get_val(h, :key3, :key4) 
    #=> {:key5=>"dog"} 
get_val(h, :key3, :key4, :key5) 
    #=> "dog" 
get_val(h, :key3, :key5, :key4) 
    #=> nil 
+1

Я думаю, что теперь этот ответ можно улучшить, используя 'Hash # dig'. –

+0

@ Джесс, да, вы правы. Я сделаю редактирование. Запоздалое спасибо. –

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