在Ruby中,为什么Array.new(size,object)创建一个由对同一对象的多个引用组成的数组?

如本回答所述 , Array.new(size, object)创建一个对同一object具有size引用的数组。

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

为什么Ruby会这样做,而不是做object cloneclone

因为这就是文档所说的。 请注意, Hash.new仅被调用一次,因此当然只有一个Hash

如果要为数组中的每个元素创建一个新对象,请将一个块传递给Array.new方法,并为每个新元素调用该块:

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

对于某些无法就地修改的类(如Fixnum ), Array.new(X, object)表单按预期工作,可能效率更高(它只调用memfill而不是rb_ary_storeyield块) :

对于更复杂的对象,您始终使用块forms(例如Array.new(5) { Hash.new } )。

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