2014-09-10 23 views
0

我遇到以下問題表示關注在Ruby中Ruby對象ID,DUP和易變性

a = [1, 2, 3] 
b = a 
b.delete_at(1) 
b => [1,3] 
a => [1,3] 
b.object_id => 70178446287080 
a.object_id => 70178446287080 

讓我有種有這樣的一個理解。 a持有對object_id的數組的引用。

b也有一個引用該同一位置爲b指向a,這是指它的object_id。基本上他們指的是同樣的事情。所以如果我爲b進行變異,a也會發生變異。

此行爲屬於什麼類別?是否有任何我可以記住的閱讀/一般做法,這樣我在將來就不會有任何錯誤?我知道a.dup會在不同位置提供新對象,因此a.dup == b應該是true。也用於a.dup.object_id == b.object_id

另外,是dupclone在這種情況下基本上是一樣的東西,無論淺淺還是深?

回答

0

#dup#clone創建對象的淺表副本。然而,#clone做兩件事情,#dup不會:

  • 副本的單例類複製對象的
  • 維持複製的對象

舉例單身的凍結狀態:

#dup:

a = Object.new 

def a.foo do 
    :foo 
end 

p a.foo 
# => :foo 

b = a.dup 
p b.foo 
# => undefined method `foo' for #<Object:0x007f8bc395ff00> (NoMethodError) 

#clone:

a = Object.new 

def a.foo do 
    :foo 
end 

p a.foo 
# => :foo 

b = a.clone 
p b.foo 
# => :foo 

舉例凍結狀態:

a = Object.new 

a.freeze 
p a.frozen? 
# => true 

b = a.dup 
p b.frozen? 
# => false 

c = a.clone 
p c.frozen? 
# => true 

因爲額外的步驟,#clone#dup慢一點(但是這可能不是什麼會讓你的應用程序太慢!)。