如何使用嵌套哈希的fetch方法?

Per*_*heo 11 ruby

我有以下哈希:

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.

  • 这是_really_不是奖金. (5认同)
  • 简而言之:“问题是——你是否有意在乎。” 我更喜欢使用“fetch”来 a) 鼓励自己仔细思考我是否关心,并且_尤其是_ b) 让那些阅读代码的人清楚我是否关心。 (2认同)
  • 这是一个错误的答案。如果密钥不存在,则 fetch 会引发错误。挖掘没有。这是根本不同的。 (2认同)

Ser*_*sev 7

编辑:现在有一种内置方式,请参阅此答案


没有我所知道的内置方法。我在我当前的项目中有这个

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而不是#[](如果您愿意)。