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

标签 ruby-on-rails ruby hash send

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

resource.public_send("#{key}=", value)

但对于 foo.bar.lolo 呢?

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

'foo.bar.lolo'.split('.').inject(resource, :send)

resource.instance_eval("foo.bar.lolo")

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

是否有一种适用于所有级别的通用方法? 对于我的例子,我可以这样做:

resource.public_send("fofo").public_send("bar").public_send("lolo=", value)

最佳答案

哈希的答案,只是出于好奇:

hash = { a: { b: { c: 1 } } }
def deep_set(hash, value, *keys)
  keys[0...-1].inject(hash) do |acc, h|
    acc.public_send(:[], h)
  end.public_send(:[]=, keys.last, value)
end

deep_set(hash, 42, :a, :b, :c)
#⇒ 42
hash
#⇒ { a: { b: { c: 42 } } }

关于ruby-on-rails - 如何在 Ruby 哈希中动态设置嵌套键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41639364/

相关文章:

ruby-on-rails - 注册时以嵌套形式传递 user_id 并保存两个模型

ruby-on-rails - 如何测试 RSpec 中的相关(耦合)方法?

ruby-on-rails - 在 Rails 中测试时如何设置 HTTP_REFERER?

ruby-on-rails - Ahoy 不记录事件或访问

ruby-on-rails - 在 Rails 中使用模态创建和编辑对象

ruby-on-rails - 如果我写 “:”冒号字符,则轮胎 Elasticsearch 错误

ruby-on-rails - 如何在磁悬浮列车上运行 Rails?

php - 2016年存储密码的最佳算法

java - HashMap#hash(int)方法的解释

php - Laravel 4 - 散列相同的密码给出不同的值