使用 `Array.new(n, Array.new)` 创建矩阵
Posted
技术标签:
【中文标题】使用 `Array.new(n, Array.new)` 创建矩阵【英文标题】:Creating matrix with `Array.new(n, Array.new)` 【发布时间】:2022-01-10 06:38:50 【问题描述】:我通过执行以下操作创建了一个数组:
@gameboard = Array.new(3, Array.new(3, " "))
我试着像这样分配一个值,我得到了这个:
@gameboard[0][2] = "X"
@gameboard #=> [[" ", " ", "X"], [" ", " ", "X"], [" ", " ", "X"]]
当我以不同的方式声明数组时,
@gameboard = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
我得到这个结果:
@gameboard[0][2] = "X"
@gameboard # => [[" ", " ", "X"], [" ", " ", " "], [" ", " ", " "]]
为什么在为数组赋值时使用Array.new
方法会导致不同的行为?
【问题讨论】:
(我确定这个问题有重复。) 我确实尝试过搜索,但找不到关于此的其他条目。如有重复请见谅! 【参考方案1】:关注代码:
@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
方法的工作方式不同;它创建了一个size
数组,具有不同的obs
。
请看下面的代码:
@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, " "], [" ", " ", " "], [" ", " ", " "]]
【讨论】:
+1 当您的答案显示时,我刚刚粘贴到@gameboard.map(&:object_id)
:)
@CarySwoveland 明天是周末.. :)【参考方案2】:
Array
constructor 不会复制您传递的对象;它将重用对象来填充数组。
使用块形式为每个索引创建一个新对象:
@gameboard = Array.new(3) |i| Array.new(3) |j| " "
【讨论】:
以上是关于使用 `Array.new(n, Array.new)` 创建矩阵的主要内容,如果未能解决你的问题,请参考以下文章
用PHP设计一个函数,要求将数字数组中所有奇数放在左边,0放在中间,偶数放在右边。
Array.new(5, [1, 2, 3]) or Array.new { [1, 2, 3] }的差别