Ruby 通过嵌套哈希循环

Ruby 通过嵌套哈希循环,ruby,Ruby,我有: 我的目标是访问键3和键4的值 我的代码是: hash = {key1: "value1", key2: {key3: "value2", key4: "value3"}} 我得到一个有错误的输出: hash.each do |key, value| puts key value.each do |k, v| puts k puts v end end 有人能解释一下发生了什么,为什么我会犯这个错误吗 key1 NoMethodError: undefine

我有:

我的目标是访问键3和键4的值

我的代码是:

hash = {key1: "value1", key2: {key3: "value2", key4: "value3"}}
我得到一个有错误的输出:

hash.each do |key, value|
  puts key
  value.each do |k, v|
    puts k
    puts v
  end
end
有人能解释一下发生了什么,为什么我会犯这个错误吗

key1
NoMethodError: undefined method `each' for "value1":String
您的散列不是散列的一致散列,在第一次迭代中,值是value1,它是一个字符串,您不能在字符串上迭代

为了避免这种情况,你可以事先检查一下

{key1: "value1", key2: {key3: "value2", key4: "value3"}}
我的目标是访问键3和键4的值。我想把它们放在某种变量中,以便在其他地方使用

可以根据键关联遍历哈希。根据上述需要,您可以简单地执行以下操作:

hash.each do |key,value|
  p key
  if value.is_a?(Hash)
    value.each do |k,v|
      p k
      p v
    end
  else
    p value
  end
end

对未来的一点建议:发布干净、格式正确的代码。来自IRB的噪音是无用的,事实上,它会分散人们阅读代码的注意力,这种结构背后的逻辑是什么?您是否需要首先筛选所有具有哈希值的键,因为您似乎无法简单地访问哈希[:key2]。值?@Ja͢ck:您的意思是您可以简单地访问吗@SergioTulentsev是的,因为在这个例子中,这将是显而易见的方法,而不是,因为它可能意味着更具动态性:谢谢大家!还有很多东西要学!:。。。或val3,val4=hash[:key2]。值位于:key3,:key4
hash[:key2][:key3]
#=> "value2"
hash[:key2][:key4]
#=> "value3"