如何在 Ruby 哈希中动态设置嵌套键的值

use*_*452 4 ruby hash ruby-on-rails send

这应该很容易,但我找不到合适的解决方案。对于第一级按键:

resource.public_send("#{key}=", value)
Run Code Online (Sandbox Code Playgroud)

但对于foo.bar.lolo

我知道我可以像下面这样得到它:

'foo.bar.lolo'.split('.').inject(resource, :send)
Run Code Online (Sandbox Code Playgroud)

或者

resource.instance_eval("foo.bar.lolo")
Run Code Online (Sandbox Code Playgroud)

但是假设我不知道嵌套级别,如何将值设置为最后一个变量,它可能是第二个或第三个。

有没有通用的方法可以为所有级别做到这一点?对于我的例子,我可以这样做:

resource.public_send("fofo").public_send("bar").public_send("lolo=", value)
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 5

出于好奇,回答哈希值:

\n\n
hash = { a: { b: { c: 1 } } }\ndef deep_set(hash, value, *keys)\n  keys[0...-1].inject(hash) do |acc, h|\n    acc.public_send(:[], h)\n  end.public_send(:[]=, keys.last, value)\nend\n\ndeep_set(hash, 42, :a, :b, :c)\n#\xe2\x87\x92 42\nhash\n#\xe2\x87\x92\xc2\xa0{ a: { b: { c: 42 } } }\n
Run Code Online (Sandbox Code Playgroud)\n