ruby-on-rails – 如何在空数组的散列上使用默认值?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何在空数组的散列上使用默认值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在需要时使用默认值重置我的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对象.

原文链接:https://www.f2er.com/ruby/267767.html

猜你在找的Ruby相关文章