我想在需要时使用默认值重置我的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对象.