如本回答所述,Array.new(size, object)创建一个size引用相同的数组object.
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"}]
Run Code Online (Sandbox Code Playgroud)
为什么Ruby会这样做,而不是做一个dup或者clone一个object?
如果我创建这个数组:
a = Array.new(3,Array.new(2,0))
Run Code Online (Sandbox Code Playgroud)
它创建:
=> [[0, 0], [0, 0], [0, 0]]
Run Code Online (Sandbox Code Playgroud)
当我尝试更改特定元素时:
a[0][0] = 3
Run Code Online (Sandbox Code Playgroud)
它改变了多个值:
=> [[3, 0], [3, 0], [3, 0]]
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我怎样才能更改特定元素?