gpt4 book ai didi

ruby - 为什么要在卡住的对象上使用 Object#clone?

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:04 26 4
gpt4 key购买 nike

好吧,出于好奇,您是否有任何理由想要使用 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,这些模板结构在使用时得到 .cloned,例如由 Sinatra、Rails、Grape 等生成的 Rack 响应处理程序。

请注意,我并不是说这些库特别深入克隆路由的详细信息,我还没有检查过。只是他们拥有创建相当任意结构副本的 DSL。它们是 系统类型,受益于 .clone 与卡住对象的一般一致行为。

关于ruby - 为什么要在卡住的对象上使用 Object#clone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085500/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com