在更改 ruby​​ 中的某些值后,如何维护具有原始值的哈希副本?

Posted

技术标签:

【中文标题】在更改 ruby​​ 中的某些值后,如何维护具有原始值的哈希副本?【英文标题】:How to maintain a copy of a hash with original values after changing some of its values in ruby? 【发布时间】:2021-12-25 07:13:15 【问题描述】:

我已尽我所能来表达这一点。我有一个哈希值,我对其执行一些操作,但在执行此操作之前,我将此哈希值存储在另一个变量中。现在当我访问这个变量时,值似乎已经改变了,我该如何绕过它。示例:

hash = a: "1", b: "2", c: "3"
hash_copy = hash
hash["a"]=4
puts(hash_copy["a"]) #prints 4 instead of 1

如何让put语句打印1而不是4,即打印原值。

【问题讨论】:

【参考方案1】:

使用 Hash#merge 代替它返回哈希的修改副本:

hash = a: "1", b: "2", c: "3"
hash_copy = hash.merge(a: 4)

一般来说,分配散列键应该只用于显式修改散列 - 对于其他一切都有更好的方法。

【讨论】:

【参考方案2】:

deep_dup是你的朋友 hash_copy = hash 只是分配一个指针而不是复制

所以特定于 ruby​​ 的选项是 clonedeep_copy 在您的情况下,copy 可以,但两者都应该适合您

Ruby 克隆

hash_copy = hash.clone

Rails,在早期的 Rails 版本中有点错误,但它是一个 ruby​​ 函数,可以为你工作

hash_copy = hash.deep_dup

是你需要的

https://apidock.com/rails/Hash/deep_dup

【讨论】:

这是一个rails函数吗?有没有我可以使用的普通 ruby​​ 版本? @DivyanshMishra 是的,它是我的答案中链接到的 rails 函数,因为您的问题被标记为 rails,我将使用 ruby​​ 哈希重复答案更新我的答案 @DivyanshMishra,已更新 感谢您的意见。使用 deep_copy(我有一个嵌套哈希),我得到这个错误“Peml:Module (NoMethodError) 的未定义方法 `deep_copy'”。 Peml 是我正在使用的模块的名称。这个函数是否与 gem 相关联? @DivyanshMishra 再次更新,对于我对 deep_copy 的误导性回答表示歉意

以上是关于在更改 ruby​​ 中的某些值后,如何维护具有原始值的哈希副本?的主要内容,如果未能解决你的问题,请参考以下文章

用户从 xcode 中的多组件选择器中选择某些值后,如何显示某个消息/警报?

ag Grid如何在更改复选框的值后刷新

更改 Scaffold.body 值后如何在颤动中隐藏抽屉

如何隔离 Ruby 中的方法 - 多处理问题

如何在Google表格中获取某些值后如何进行正则表达式提取

如何在文本框中输入值后单击输入更改图像?