讨论为什么使用dup而不是克隆的实际项目的例子,反之亦然,对于这个问题来说是理想的.
或者,解释为什么存在两种不同的方法将是有帮助的.这可以引用Ruby的创建者的声明,或者是在影响Ruby的语言中检查诸如dup和clone之类的方法.
解决方法
o = Object.new o.freeze o.clone.frozen? #=> true o.dup.frozen? #=> false
克隆还将复制对象的单例方法,而dup不会:
o = Object.new def o.foo 42 end o.clone.respond_to?(:foo) #=> true o.dup.respond_to?(:foo) #=> false
这导致我认为克隆有时被理解为提供比dup更“复杂”的假设.这里有一些关于这个主题的引语:
Comment on ActiveRecord::Base#initialize_dup
from Rails 3:
Duped objects have no id assigned and are treated as new records. Note
that this is a “shallow” copy as it copies the object’s attributes
only,not its associations. The extent of a “deep” copy is application
specific and is therefore left to the application to implement according
to its need.
An article about deep copies in Ruby:
There is another method worth mentioning,
clone
. Theclone
method does the same thing asdup
with one important distinction: it’s expected that objects will override this method with one that can do deep copies.
But then again,theres deep_dup
in Rails 4:
Returns a deep copy of object if it’s duplicable. If it’s not duplicable,returns
self
.
and also ActiveRecord::Core#dup
and #clone
in Rails 4:
clone
— Identical to Ruby’s clone method. This is a “shallow” copy. Be warned that your attributes are not copied. […] If you need a copy of your attributes hash,please use the#dup
method.
这意味着在这里,dup这个词再次被用来指代一个深的克隆.据我所知,在社区中似乎没有共识,只要您需要使用clone和dup,当您需要任何一个特定的副作用时.
最后,我在Ruby代码中看到dup比克隆更多.到目前为止,我从来没有使用过克隆,直到明确需要我才会使用克隆.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。