2011-01-09 91 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 })。

* 编辑:*根据评论修改。对不起,这个愚蠢的例子,当我写这些时,我很累。

相关问题