【问题标题】:Is cloning in self language deep clone or shallow one?自我语言中的克隆是深克隆还是浅克隆?
【发布时间】:2013-07-21 09:21:07
【问题描述】:

我正在努力理解自己的语言。

我的疑问是,无论是自我语言的深克隆还是浅克隆。 即,无论克隆只是克隆对象槽还是槽内的对象都被克隆。

【问题讨论】:

  • 你的意思是浅拷贝吗?
  • 是的。让我清除我的自我。考虑一个 self 对象 bankAccount。假设它由对象 accountholder = Person 组成。考虑我已经克隆了银行账户来创建一个新的银行账户。现在,如果我更改了新的Bankaccount.accountholder.name。它是否会影响我从中克隆的原始对象 bankAcclount?

标签: clone self prototype-programming selflanguage


【解决方案1】:

正如 Tobias 所说,copy 消息通常被实现为浅拷贝。

语义上,Self 中的copy 几乎意味着“给我一份安全/有用的副本”。对于许多对象来说,这只是一个浅拷贝。

对象负责实现自己的copy,方法是委托给纯浅拷贝方法,例如traits clonable 中的实现,或者拥有自己的copy 槽。

例如,变形通常通过为您提供可用副本而不是浅副本来响应copy 消息。此外,不应复制的对象通常会实现或委托给方法 copy = (self),因此尝试复制只会返回原始对象。

如果你想要一个严格的浅拷贝,大多数可拷贝对象都会响应clone,尽管这应该小心使用。基础是 VM 定义的原始方法 _Clone,它是一个浅拷贝。

【讨论】:

  • 这个答案比我的好。
【解决方案2】:

通常,self 中的克隆是浅拷贝。

关于您的评论,是的,它会改变。 这就是你克隆“空”原型的原因。

请注意,当您克隆原型以制作新原型时,自己知道 copy-downs 可以选择性地将插槽内容复制更深一层。

【讨论】:

  • 感谢您的快速信息。老实说,我无法理解copy-down。作为一个新手,我得到的只是这个行话:Copy-down is not part of the Self language but a mechanism in the Self programming environment,它解决了继承数据成员的问题。
  • 嗯,Self 不使用类进行代码共享,而是使用原型;您克隆的模板对象以创建新的“真实”对象。当你想创建新的 prototypes 时,你必须克隆旧的。在这种情况下,您想要复制插槽,这就是复制的目的。它说“不是Self语言的一部分”是指这样一个事实,即复制不是语言结构而是简单的消息。无论如何,在您的情况下,您可能只需要一个slot initializer,当您克隆bankAccount 时,它会克隆一个新的accountholder
  • @thobias 我需要澄清一下,考虑 bankAccount 有父 bankAccountTrait。假设 bankAccountTrait 有一个名为 "bankname" 的插槽。在 bankAccount 中设置“bankname”是否会更改 bankAccountTrait 上插槽的值?我想答案是否定的。如果是这样,您能否解释一下如何修改其接收者的方法。(我只知道“self *”作为父方法发送给方法)
  • 我想将上述评论作为一个单独的问题。但我没有正确表达它。
猜你喜欢
  • 1970-01-01
  • 2013-10-11
  • 2013-04-28
  • 2017-09-17
  • 2010-10-19
  • 2011-09-05
  • 1970-01-01
  • 2013-09-06
相关资源
最近更新 更多