gpt4 book ai didi

ruby - 将克隆对象的所有责任转移给库的用户是否正确?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:22 25 4
gpt4 key购买 nike

我对这件事不是很了解所以我决定在这里问一下。假设我们在 Ruby(或任何其他通过引用传递的脚本语言)中有一些“库”:

class Moo
attr_accessor :bar
def initialize
self
end
end

a = 'a string'
b = Moo.new
b.bar = a

b.bar 显然与 a 是同一个对象。

所有情况中保留它是否正确,以便需要它们分开的程序员将手动进行克隆?这是我最后得出的唯一明智的想法。

最佳答案

正在关注 the principle of least surprise , 像您所做的那样维护对分配对象的引用是正确的。

如果您在内部做了 dup 分配给 bar 的对象,这会让消费者非常沮丧希望 bar 引用相同对象的图书馆。

> class Moo
> attr_accessor :bar
> end
=> nil
> a = 'a string'
=> "a string"
> b = Moo.new
=> #<Moo:0x2bfd238>
> b.bar = a
=> "a string"
> a.upcase!
=> "A STRING"
> b.bar # should be uppercase as expected since `a` was modified *in-place*
=> "A STRING"
> b.bar = a.dup # now modifications to `a` will not affect `bar`
=> "A STRING"
> a.downcase!
=> "a string"
> b.bar
=> "A STRING"

作为旁注,def initialize() self end 完全没有必要,因为它与默认的 initialize 相同。

关于ruby - 将克隆对象的所有责任转移给库的用户是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2875693/

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