【问题标题】:Creating matrix with `Array.new(n, Array.new)`使用 `Array.new(n, Array.new)` 创建矩阵
【发布时间】:2014-04-20 10:58:05
【问题描述】:

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

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

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

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

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

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

我得到这个结果:

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

为什么在为数组赋值时使用Array.new 方法会导致不同的行为?

【问题讨论】:

  • (我确定这个问题有重复。)
  • 我确实尝试过搜索,但找不到关于此的其他条目。如有重复请见谅!

标签: ruby arrays


【解决方案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| " " } }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多