ruby - 用 `Array.new(n, Array.new)` 创建矩阵

标签 ruby arrays

我通过执行以下操作创建了一个数组:

@gameboard = Array.new(3, Array.new(3, " "))

我试着像这样分配一个值,我得到了这个:

@gameboard[0][2] = "X"
@gameboard #=> [[" ", " ", "X"], [" ", " ", "X"], [" ", " ", "X"]]

当我以不同方式声明数组时,

@gameboard = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]

我得到这个结果:

@gameboard[0][2] = "X"
@gameboard # => [[" ", " ", "X"], [" ", " ", " "], [" ", " ", " "]]

为什么在为数组赋值时使用 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 }方法以不同的方式工作;它创建一个 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, " "], [" ", " ", " "], [" ", " ", " "]]

关于ruby - 用 `Array.new(n, Array.new)` 创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417074/

相关文章:

ruby-on-rails - simple_format 正在剥离目标 _blank

ruby - 使用集合合并范围 - 错误 - 堆栈级别太深 (SystemStackError)

java - 是否有 java 不允许泛型类数组的解决方法

c# - 列表中的数组

java - 动态查找字符串以寻址串行端口

ruby - 当在 Ruby 中扩展模块时,内部会发生什么?

ruby - 棘手的 ruby​​ 类初始化----为什么同一个类初始化输出不同?

指向字符数组的字符指针而不是赋值

javascript - jQuery 获取文档中的所有 href url 并 chop 或拆分它们

python - 如果行(或列)中的所有值不满足给定条件,则删除对称数组中的行和列