首页 > 解决方案 > 哈希似乎是通过引用传递的:Ruby

问题描述

我知道标题是模棱两可的,所以让我们看看下面的例子。我有一个 Hash 命名sh,然后我分配sh给一个新变量su,之后我正在修改sh,但su也得到修改。我想保留su原创内容。

irb(main):001:0> sh = {"name"=>"shan", "age"=>"33" , "sex"=>"male"}
=> {"name"=>"shan", "age"=>"33", "sex"=>"male"}
irb(main):002:0> su = sh
=> {"name"=>"shan", "age"=>"33", "sex"=>"male"}
irb(main):003:0> su
=> {"name"=>"shan", "age"=>"33", "sex"=>"male"}

irb(main):005:0> sh.delete("sex")
=> "male"
irb(main):006:0> sh
=> {"name"=>"shan", "age"=>"33"}  => ok here
irb(main):007:0> su
=> {"name"=>"shan", "age"=>"33"}   => ??

irb(main):010:0> sh["city"] = "Bangalore"  => New example
=> "Bangalore"
irb(main):011:0> sh 
=> {"name"=>"shan", "age"=>"33", "city"=>"Bangalore"} =>  ok
irb(main):012:0> su 
=> {"name"=>"shan", "age"=>"33", "city"=>"Bangalore"}  => ??  

标签: rubyruby-hash

解决方案


clone 方法是 Ruby 标准的、内置的浅拷贝方法:

su = sh.clone

备注:上述解决方案仅适用于非嵌套哈希。在嵌套散列的情况下,您需要编组

su = Marshal.load(Marshal.dump(sh))

推荐阅读