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")
但有没有更好的办法呢?
7条答案
按热度按时间lf5gs5x21#
它不是没有警告(如果您从其他地方接收哈希值,它就不起作用),但一个常见的解决方案是:
jaxagkaj2#
基于@rellampec的答案,我们可以找到不抛出错误的方法:
t3irkdon3#
有趣的是:
如果没有
[]
或[]=
方法,无论如何都会引发异常。sqserrrh4#
我发现了一个简单的解决方案来设置嵌套哈希的值,即使父键丢失,即使哈希已经存在。
假设您希望包含mario's drum以生成:
最后我给猴子打了补丁Hash:
用法:
示例的用法:
我错过了什么警告?有没有更好的方法在不牺牲可读性的情况下编写代码?
vhipe2zx5#
在寻找一个类似问题的答案时,我偶然发现了一个类似于@niels-kristian答案的接口,但我还想支持一个名称空间定义参数,比如xpath。
嵌套哈希有点像xpath,而
dig
的对立面是bury
。oymdgrw76#
@niels-kristian答案的一个更像ruby助手的版本
您可以像这样使用它:
w6lpcovy7#
可以使用
merge!