数组文字与新的,不同的行为?

时间:2014-10-24 07:39:12

标签: ruby arrays immutability

我不明白为什么这两个数组(见下文)表现不同。

dotnew = Array.new(5, [])
literal = [[], [], [], [], []]

dotnew[0] << 1
dotnew # => [[1], [1], [1], [1], [1]]

literal[0] << 1
literal # => [[1], [], [], [], []]

1 个答案:

答案 0 :(得分:4)

因为在dotnew中只有一个数组和5个引用它。当您通过其中一个引用更改数组时,其他人也会看到它。

来自docs

  

在第一种形式中,如果没有发送参数,则新数组将为空。当发送大小和可选的obj时,将创建一个大小为obj的数组。请注意,所有元素都将引用相同的对象obj。

在文字的情况下,有5个不同的数组(每个数组都有一个引用)。

也许,你想这样做:

dotnew = Array.new(5) { [] }
dotnew[0] << 1
dotnew # => [[1], [], [], [], []]