如何在Ruby中动态设置嵌套哈希?

14

假设我有一个嵌套的哈希表:

h = { 'one' =>
        {'two' =>
            {'three' => 'a'}
        }
     }

我可以像这样更改它:

h['one']['two']['three'] = 'b'

我该如何使用变量作为键来更改嵌套值?

假设我有以下变量:

key = "one.two.three"
为了动态访问它,我使用以下方法:

key.split('.').inject(h,:[])

但是,当然,将其设置为这样并不起作用:

key.split('.').inject(h,:[]) = 'b' # fails

那么我如何动态设置嵌套哈希的值?

2个回答

20

Hash#[]= 是一个独立的方法。你不能一直使用 Hash#[] 到最后一个键,然后对其进行 = 操作。相反,省略掉最后一个键,并逐个使用 Hash#[]= 进行操作。

*key, last = key.split(".")
key.inject(h, :fetch)[last] = "b"

0
sawa的回答基础上,使用现代Ruby中的Hash#dig,这变得更简单了:
    
*key, last = key.split(".")
    
h.dig(key)[last] = "b"
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接