加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读