我不明白为什么这两个数组(见下文)表现不同。
dotnew = Array.new(5, [])
literal = [[], [], [], [], []]
dotnew[0] << 1
dotnew # => [[1], [1], [1], [1], [1]]
literal[0] << 1
literal # => [[1], [], [], [], []]
答案 0 :(得分:4)
因为在dotnew
中只有一个数组和5个引用它。当您通过其中一个引用更改数组时,其他人也会看到它。
来自docs:
在第一种形式中,如果没有发送参数,则新数组将为空。当发送大小和可选的obj时,将创建一个大小为obj的数组。请注意,所有元素都将引用相同的对象obj。
在文字的情况下,有5个不同的数组(每个数组都有一个引用)。
也许,你想这样做:
dotnew = Array.new(5) { [] }
dotnew[0] << 1
dotnew # => [[1], [], [], [], []]