使用`Array.new(n,Array.new)`创建矩阵
我通过执行以下操作创建了一个数组:
@gameboard = Array.new(3, Array.new(3, " "))
我尝试分配这样的值,我得到了这个:
@gameboard[0][2] = "X" @gameboard #=> [[" ", " ", "X"], [" ", " ", "X"], [" ", " ", "X"]]
当我以不同方式声明数组时,
@gameboard = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
我得到这个结果:
@gameboard[0][2] = "X" @gameboard # => [[" ", " ", "X"], [" ", " ", " "], [" ", " ", " "]]
为数组赋值时,为什么使用Array.new
方法会Array.new
不同的行为?
遵循以下代码:
@gameboard = Array.new(3, Array.new(3, " ")) @gameboard.map { |a| a.object_id } # => [76584030, 76584030, 76584030]
表示new(size=0, obj=nil)
方法创建一个size
数组,具有相同的ob
。
但new(size) {|index| block }
new(size) {|index| block }
方法以不同的方式工作; 它会创建一个size
的数组。
请参阅以下代码:
@gameboard = Array.new(3) { Array.new(3, " ") } @gameboard.map { |a| a.object_id } # => [75510080, 75509920, 75509540]
以上内容与您的第二个代码示例相同:
@gameboard = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]] @gameboard.map { |a| a.object_id } # => [80194090, 80193400, 80193080]
如果更改或更新@gameboard
的第一个元素数组的索引1
处的值,则不会影响所有其他内部数组元素。
@gameboard = Array.new(3) { Array.new(3, " ") } @gameboard[0][1] = 2 @gameboard # => [[" ", 2, " "], [" ", " ", " "], [" ", " ", " "]]
Array
构造函数不会复制您传递的对象; 它将重用该对象来填充数组。
使用块表单为每个索引创建一个新对象:
@gameboard = Array.new(3) { |i| Array.new(3) { |j| " " } }