2013-12-23 99 views

回答

2

見哈希#替換documentation

a = {:a => 'a'} 

上面行創建在一個變量a哈希對象並將其存儲,a是到對象

a = {:a => 'a'} 
=> {:a=>"a"} 
2.0.0p247 :040 > a.object_id 
=> 70094303544580 

a = {:b => c} 

上面參考第一行做的是同樣的事情,但它將覆蓋對內存中前一個Hash對象的引用

2.0.0p247 :042 > a = {:b => 'c'} 
=> {:b=>"c"} 
2.0.0p247 :043 > a.object_id 
=> 70094303594480 

object_id是不同

最後:

2.0.0p247 :044 > a.replace({b: "d"}) 
=> {:b=>"d"} 
2.0.0p247 :045 > a 
=> {:b=>"d"} 
2.0.0p247 :046 > a.object_id 
=> 70094303594480 

替換爲我們指的是前面提到的同一個對象,但哈希對象的內容現在改變了,看到object_id保持不變

+0

'對象#object_id'是一個很好的方法來解釋這個帖子..所以... +1 :) –

+0

我很驚訝我得到了2票反對這個答案,並沒有人評論爲什麼需要投下的投票 – bjhaid

+0

我知道......多次發生在我身上......忽略這些...... –

2

這會爲變量a分配一個新對象:

a = {:b => c} 

而這使用現有的哈希和替換/刪除現有的值:

a.replace({:b => c}) 
2

分配不會做任何的變量先前指向對象,但replace修改對象。

如果你有一段代碼指向到a,那麼a分配到不同的東西不改變:

a = {:a => 'a'} 
b = a 
c = [:bar, a, :baz] 

a = {:b => :foo} 
b # => {:a => 'a'} 
C# => [:bar, {:a => 'a'}, :baz] 

replace修改任何先前指向a

a = {:a => 'a'} 
b = a 
c = [:bar, a, :baz] 

a.replace({:b => :foo}) 
b # => {:b => :foo} 
C# => [:bar, {:b => :foo}, :baz]