【问题标题】:How to maintain a copy of a hash with original values after changing some of its values in ruby?在更改 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,即打印原值。

【问题讨论】:

    标签: ruby-on-rails ruby object ruby-on-rails-3 hash


    【解决方案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 的误导性回答表示歉意
      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 2016-06-16
      • 2023-03-24
      • 2017-12-20
      • 2020-06-06
      • 2015-09-15
      相关资源
      最近更新 更多