Ruby如何使用key path遍历hash map?

How to use a key path to traverse a hash map in Ruby?

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

nested_hash = {
  foo: foo,
  bar: {
    foo: foo,
    bar: {
      foo: foo,
      bar: {
        foo: bar
      }
    }
  }
}

要访问不同级别的值,您可以使用多种方法,如下所示:

def one_level(key1)
  nested_hash[key1]
end

def two_levels(key1, key2)
  nested_hash[key1][key2]
end

def three_levels(key1, key2, key3)
  nested_hash[key1][key2][key3]
end

但也许您需要像这样的一种方法:

def up_to_three_levels(key1, key2, key3)
  if key1 && key2 && key3
    nested_hash[key1][key2][key3]
  elif key1 && key2
    nested_hash[key1][key2]
  else
    nested_hash[key1]
  end
end

这显然不理想并且无法扩展。如果我可以传递任意长度的数组以达到任意级别,那就太好了。有没有这样的方法?

(上下文:我试图解决的问题是我需要将关键路径作为参数并使用它从多个不同的数据结构中获取数据。)

是的。它被称为 dig:

nested_hash.dig(key1, key2, key3)

它不接受数组,但有 splat 运算符 (*) 可让您将数组转换为参数列表,如下所示:

nested_hash.dig(*[key1, key2, key3])

并不是说您必须自己实现它,但我认为了解这是一个非常简单的递归问题,只需几行代码即可解决:

def dig(collection, keys)
    if keys.length == 0 || collection == nil
        collection
    else
        dig(collection[keys[0]], keys.drop(1))
    end
end

还值得注意的是 dig 也存在于数组中,您可以在嵌套结构中混合使用数组和哈希映射,并使用 dig.[=18= 无缝遍历它]