ruby-on-rails – 如何在空数组的散列上使用默认值?
发布时间:2020-12-16 21:12:59 所属栏目:百科 来源:网络整理
导读:我想在需要时使用默认值重置我的ary.但是,当ary的值发生变化时,我无法弄清楚如何不更改默认值. default = {"a"=[],"b"=[],"c"=[]}= {"a"=[],"c"=[]} ary = default.clone= {"a"=[],"c"=[]} ary["a"] "foo"= ["foo"] default= {"a"=["foo"],"c"=[]} 解决方法
我想在需要时使用默认值重置我的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对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |