我遇到以下情况。我希望只有第一个子数组的第一个子元素被分配"x"
,而不是每个子数组的第一个元素。任何人都可以解释这种行为,也许可以解决这个问题? (请注意,这可能是预期的行为,但如果是,则与我的期望相矛盾。)
x = Array.new(3, Array.new(5))
# => [[nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil]]
x[0][0] # => nil
x[0][0] = "x"
x
# => [["x", nil, nil, nil, nil], ["x", nil, nil, nil, nil], ["x", nil, nil, nil, nil]]
答案 0 :(得分:5)
解决方法是:
x = Array.new(3) { Array.new(5) }
x[0][0] = 'a'
x # => [["a", nil, nil, nil, nil], [nil, nil, nil, nil, nil], [nil, nil, nil, nil, nil]]
这里创建了给定大小的数组。通过将元素的索引传递给给定块并存储返回值来创建此数组中的每个元素。
另请阅读Common gotchas
发送第二个参数时,同一个对象将用作所有数组元素的值。由于所有Array元素都存储相同的数组
Array.new(5)
,因此对其中一个数组的更改将影响它们。如果您想要多个副本,则应该使用每次需要初始化数组元素时使用该块结果的块版本,如上所述。
答案 1 :(得分:0)
2d_array = Array.new(rows) { Array.new(columns) }