Ruby 使用变量访问嵌套哈希

Ruby 使用变量访问嵌套哈希,ruby,hash,Ruby,Hash,我有一个嵌套哈希,如下所示: someVar = { key1: { key2: 'value' } } 我可以通过以下方式使用该值: someVar[:key1][:key2] 如何使用变量访问它 hashObj = { key1: { key2: 'value' } } oneKey = "key1" twoKey = "key2" puts hashObj[:key1] # Works puts hashObj[:key1][:key2] # Works

我有一个嵌套哈希,如下所示:

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

我肯定这个问题的某个地方有重复的地方,但我似乎找不到。你的键是符号,你试图用字符串访问它们。把它们变成符号:

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

您的键是符号,您正试图使用字符串访问它们。把它们变成符号:

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

您可能会发现编写一个小方法来提取所需的值很方便:

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+,您可以通过以下方式改进此功能:


您可能会发现编写一个小方法来提取所需的值很方便:

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+,您可以通过以下方式改进此功能:


@铁皮人你为什么要编辑这么小的内容?没有使问题变得更清楚。编辑使措辞更直接,并修正了一些语法错误。堆栈溢出的目标是像维基百科中的编程问题和解决方案一样。语法很重要,简洁也很重要。人们喜欢友好,就像是在论坛或聊天,但事实并非如此。取而代之的是,它是一本更温和的百科全书。@theTinMan那里没有语法问题,这个问题也不是间接的(在我看来)。“你可以编辑你的感受,”铁皮人说,“你为什么要编辑这么小的内容呢?”?没有使问题变得更清楚。编辑使措辞更直接,并修正了一些语法错误。堆栈溢出的目标是像维基百科中的编程问题和解决方案一样。语法很重要,简洁也很重要。人们喜欢友好,就像是在论坛或聊天,但事实并非如此。取而代之的是,它是一本更温和的百科全书。@theTinMan那里没有语法问题,这个问题也不是间接的(在我看来)。你可以编辑你的感受。