2014-11-20 159 views
0

我有一个嵌套的哈希值,像这样:利用可变访问使用变量嵌套哈希

someVar[:key1][:key2] 

我将如何访问:

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

我可以通过这种方式使用它访问值?

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铁皮人,为什么你把这样的小编辑的任何原因?不会让问题更加清楚。 – 2014-11-20 22:09:00

+0

编辑使措辞更加直接,并修复了一些语法错误。堆栈溢出的目标是像维基百科的编程问题和解决方案。语法和简洁一样重要。人们喜欢友善,好像SO是BBS或聊天,但事实并非如此。相反,它是一个更亲切和温和的百科全书。 – 2014-11-20 22:20:13

+0

@TheTinMan虽然没有语法问题,但问题也不是间接的(在我看来)。你可以编辑你的感受。 – 2014-11-20 22:29:39

回答

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) 

被输入。

编辑:使用Ruby 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'来改进。 – 2016-01-06 03:44:43

+0

@Jesse,是的,你是对的。我会做一个编辑。迟来的谢谢。 – 2016-01-12 01:48:32