使用Hash#dig提取哈希值

时间:2016-01-05 18:03:23

标签: ruby hash dig ruby-2.3

h = {
  users: {
    u_548912: {
      name: "John",
      age: 30
    },
    u_598715: {
      name: "Doe",
      age: 30
    }
  }
}

鉴于上面的哈希,说我想得到用户 John ,我可以做

h[:users].values.first[:name]    # => "John"

在Ruby 2.3中,使用Hash#dig可以做同样的事情:

h.dig(:users, :u_548912, :name)  # => "John"

但鉴于u_548912只是一个随机数(无法事先知道),有没有办法让信息仍在使用Hash#dig

1 个答案:

答案 0 :(得分:2)

当然,您可以将表达式作为参数传递给#dig

h.dig(:users, h.dig(:users)&.keys&.first, :name)
#=> John

如果您想要更易读,请以代码行为代价提取密钥:

first_user_id = h.dig(:users)&.keys&.first
h.dig(:users, first_user_id, :name)
#=> John

另一种选择是链接您的#dig方法调用。这个更短,但不太清晰。

h.dig(:users)&.values&.dig(0, :name)
#=> John

我担心在保持安全导航的同时没有“整洁”的方式。