在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
clone
或clone
?
因为这就是文档所说的。 请注意, 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_store
并yield
块) :
对于更复杂的对象,您始终使用块forms(例如Array.new(5) { Hash.new }
)。
* 编辑 :*根据评论修改。 对不起这个愚蠢的例子,当我写这篇文章时我很累。