ruby-on-rails - 将哈希常量克隆到新变量中,而不会在使用 .each block 更新时改变常量?

标签 ruby-on-rails ruby constants immutability ruby-hash

我正在为某件事而苦苦挣扎。我已将代码抽象得尽可能简单,但我仍然不明白为什么它会出现这种行为。

我正在创建一个由一组键值对组成的常量并将其卡住。然后,我使用 .dup 方法将哈希值复制到新变量中。

但是,当我迭代一个数组并尝试将其存储在新变量的(以前为空)数组中时,它不仅会更新新变量,还会更新原始常量。这似乎只是 .each 方法的情况 - 如果我直接将新值作为新数组传递,它可以在不更新常量的情况下工作。

我的抽象代码如下:

CONFIG_VALUES = { results: [], loop_count: 0 }.freeze
the_results = ["foo", "bar"]
abc = CONFIG_VALUES.dup
the_results.each do |res| 
  abc[:results] << res
end
abc
#=> {:results=>["foo", "bar"], :loop_count=>0}
CONFIG_VALUES
#=> {:results=>["foo", "bar"], :loop_count=>0}

最佳答案

Hash#dup 方法不是递归的。无论如何,如果您使用 Ruby on Rails,并且我认为自从您标记它以来您就这样做了,您可以使用 #deep_dup 方法:http://api.rubyonrails.org/classes/Hash.html#method-i-deep_dup

这是一个 ActiveSupport 方法,因此如果您不使用 Ruby on Rails,则可以使用 gem。

关于ruby-on-rails - 将哈希常量克隆到新变量中,而不会在使用 .each block 更新时改变常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50159473/

相关文章:

ruby-on-rails - 如何使用 Ruby/Rails 从网站获取内容?

ruby-on-rails - Ruby on Rails - 每月最高票数

php - 在常量中添加变量

go - Go 中的常量全局用户类型值

c++ - 将调用哪个重载版本的运算符

javascript - Materialise 选项卡突然不再工作了

ruby-on-rails - Rails 与 Authlogic,如何删除默认验证?

ruby - 比较两个字符串相似度的最佳方法是什么?

ruby-on-rails - 摆脱不会死亡的 ruby

ruby-on-rails - rails 5 : ActiveRecord OR query