【发布时间】:2016-04-09 19:06:40
【问题描述】:
h = {
data: {
user: {
value: "John Doe"
}
}
}
要给嵌套散列赋值,我们可以使用
h[:data][:user][:value] = "Bob"
但是如果中间缺少任何部分,就会导致错误。
有点像
h.dig(:data, :user, :value) = "Bob"
不起作用,因为还没有可用的Hash#dig=。
为了安全地赋值,我们可以这样做
h.dig(:data, :user)&.[]=(:value, "Bob") # or equivalently
h.dig(:data, :user)&.store(:value, "Bob")
但是有更好的方法吗?
【问题讨论】:
-
对于它的价值,这里已经讨论过(并被 Matz 拒绝(暂时):bugs.ruby-lang.org/issues/11747
-
@JordanRunning 但它可以在 Ruby 2.5 中运行!
-
@MikeSzyndel 具体来说,在 Ruby 2.5 中起作用的是什么?仍然没有
Hash/Array#bury或等效方法。 -
我刚刚成功使用
h.dig(:data, :user)&.store(:value, "Bob")编辑了一个复杂的哈希(解析的JSON文件)。没有埋葬,但这种方法很干净,对我来说足够有用:)
标签: ruby hash dig ruby-2.3 safe-navigation-operator