我想在需要时使用默认值重置我的ary.但是,当ary的值发生变化时,我无法弄清楚如何不更改默认值.
> default = {"a"=>[],"b"=>[],"c"=>[]} => {"a"=>[],"c"=>[]} > ary = default.clone => {"a"=>[],"c"=>[]} > ary["a"] << "foo" => ["foo"] > default => {"a"=>["foo"],"c"=>[]}
解决方法
你在这里发现的是Hash#clone只做一个浅层克隆,即它只复制自身而不复制其中引用的对象.
有许多“深度克隆”宝石可以解决这个特定问题,或者您可以编写自己的宝石来解决它:
class Hash def deep_clone Hash[collect { |k,v| [ k,v.respond_to?(:deep_clone) ? v.deep_clone : v ] }] end end class Array def deep_clone collect { |v| v.respond_to?(:deep_clone) ? v.deep_clone : v } end end
这将允许您根据需要克隆任意Hash和Array对象.