2

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

class Moo
    attr_accessor :bar
    def initialize
        self
    end
end

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

b.bar显然将是与 相同的对象a

在所有情况下都保持原样是否正确,以便需要它们分开的程序员将手动克隆?这是我最终得到的唯一理智的想法。

4

1 回答 1

2

按照最不意外的原则,保持对已分配对象的引用是正确的。

如果您内部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完全没有必要,因为它与 default 相同initialize

于 2010-05-20T16:24:37.947 回答