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)
出于好奇,回答哈希值:
\n\nhash = { 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 } } }\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
4414 次 |
| 最近记录: |