在更改 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 的选项是 clone
和 deep_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 中的某些值后,如何维护具有原始值的哈希副本?的主要内容,如果未能解决你的问题,请参考以下文章