2011-01-09 29 views

回答

9

因爲這就是the documentation所說的。需要注意的是Hash.new纔會被調用一次,所以當然如果你想創建數組中的每個元素的新對象,塊傳遞給Array.new方法只有一種Hash

,以及該塊將被要求每一個新的元素:

>> a = Array.new(2) { Hash.new } 
=> [{}, {}] 
>> a[0]['cat'] = 'feline' 
=> "feline" 
>> a 
=> [{"cat"=>"feline"}, {}] 
>> a[1]['cat'] = 'Felix' 
=> "Felix" 
>> a 
=> [{"cat"=>"feline"}, {"cat"=>"Felix"}] 
+2

「因爲這就是文檔所說的。」 - 我希望能夠將這個原因推進一點。 – 2011-01-09 23:58:31

+1

彈出原因堆棧:因爲當您傳入要用於預填充數組的對象時,該數組將被預填充該對象。 – yfeldblum 2011-01-10 00:53:50

2

對於某些類別的不能在原地進行修改(如Fixnum S)的Array.new(X, object)形式按預期工作,並可能是更有效的(它只是調用memfill而不是rb_ary_storeyield荷蘭國際集團到該塊):

對於更復雜的對象,您始終使用塊形式(例如, Array.new(5) { Hash.new })。

* 編輯:*根據評論修改。對不起,這個愚蠢的例子,當我寫這些時,我很累。

相關問題