好的,出于好奇,您是否有任何理由要Object#clone
在冻结的对象上使用?据我了解,使用Object#dup
和的唯一原因Object#clone
是获得现有对象的第二个副本,以便您可以在不更改原始对象的情况下对其进行修改。但是Object#clone
复制对象的冻结状态,并且您不能修改冻结的对象,那么您是否有任何理由要在该上下文中使用它?
与此相关的是,如果没有用例,是否有任何原因?
f = "Some string"
f.frozen? #=> false
f.freeze
f.frozen? #=> true
f2 = f.clone
f2.frozen? #=> true
f2.equal? f #=> false
# Why bother? You can't change f or f2 anyway, so
# why even copy it at all?
有时(实际上是很多时候),您可能.clone
不知道或不想知道其中的对象种类或它们是否冻结的结构。
在这种情况下,冻结对象的行为类似于非冻结对象,这很有用,这样.clone
可以满足人们对工作原理的普遍期望。为了澄清起见,其中.clone
包括保留冻结状态(虽然dup
不会在副本中保留该冻结状态)。保留冻结状态可确保副本的行为相同-无法修改对象是重要的属性和行为。
换句话说,如果冻结的对象不这样做,则它们可能会破坏或引起用于.clone
处理通用结构的Ruby代码的复杂性。这样的一个例子可能是DSL,这些DSL建立了.clone
使用时会得到d的模板结构,例如Sinatra,Rails,Grape等生成的Rack响应处理程序。
请注意,我并不是说这些库专门做深层克隆路由的详细信息,我没有检查过。只是他们拥有可创建相当任意结构的副本的DSL。它们是受益于冻结对象的一般,一致行为的系统类型.clone
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句