【问题标题】:Is it right to move all responsibility for cloning objects to user of a library?将克隆对象的所有责任转移给图书馆的用户是否正确?
【发布时间】:2010-05-20 16:12:53
【问题描述】:

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

class Moo
    attr_accessor :bar
    def initialize
        self
    end
end

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

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

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

【问题讨论】:

    标签: ruby pass-by-reference cloning


    【解决方案1】:

    按照the principle of least surprise,保持对已分配对象的引用是正确的。

    如果您确实在内部将dup 分配给bar 的对象,非常让想要您图书馆的消费者感到沮丧em> 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 相同。

    【讨论】:

    • 我试图找到这个问题的答案已经有一段时间了。谢谢你。至于默认的initialize,它确实有效。我记得不久前没有,但似乎还有一个与initialize的存在无关的问题。
    猜你喜欢
    • 2013-03-04
    • 2015-02-22
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2010-10-18
    相关资源
    最近更新 更多