我有以下哈希:
hash = {'name' => { 'Mike' => { 'age' => 10, 'gender' => 'm' } } }
Run Code Online (Sandbox Code Playgroud)
我可以通过以下方式访问年龄:
hash['name']['Mike']['age']
Run Code Online (Sandbox Code Playgroud)
如果我使用Hash#fetch方法怎么办?如何从嵌套哈希中检索密钥?
正如塞尔吉奥所说,做到这一点的方式(不为自己创造一些东西)将是一系列fetch方法:
hash.fetch('name').fetch('Mike').fetch('age')
Run Code Online (Sandbox Code Playgroud)
ndn*_*kov 38
从Ruby 2.3.0开始,您可以使用Hash#dig:
hash.dig('name', 'Mike', 'age')
Run Code Online (Sandbox Code Playgroud)
它还带来额外的好处,如果一路上的某些值出现nil,你将得到nil而不是例外.
在迁移之前,您可以使用ruby_dig gem.
编辑:现在有一种内置方式,请参阅此答案。
没有我所知道的内置方法。我在我当前的项目中有这个
class Hash
def fetch_path(*parts)
parts.reduce(self) do |memo, key|
memo[key.to_s] if memo
end
end
end
# usage
hash.fetch_path('name', 'Mike', 'age')
Run Code Online (Sandbox Code Playgroud)
您可以轻松修改它以使用#fetch而不是#[](如果您愿意)。