2010-05-20 22 views
2

我對這件事情並不是很瞭解,所以我決定在這裏問問。比方說,我們有一些紅寶石「圖書館」(或任何其他通過引用傳遞腳本語言):將克隆對象的所有責任移動到庫的用戶是否正確?

class Moo 
    attr_accessor :bar 
    def initialize 
     self 
    end 
end 

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

b.bar顯然將是相同的對象a

離開它是否正確所有情況下所以程序員誰需要他們分開手動克隆?這是我結束的唯一理智的想法。

回答

2

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

+0

我試圖找到相當長一段時間的答案。謝謝。 至於默認'初始化'它確實有效。我記得它沒有一段時間,但似乎有另一個問題與'initialize'的存在無關。 – 2010-05-20 16:34:29