将八个对象铲到每个数组索引 ruby

shovel eight objects into each array index ruby

有没有办法重构这段代码?第一个片段是我目前拥有的片段,第二个片段是我正在尝试制作的逻辑。

count = 0
until count >= board.length
  if board[count] == nil
    board[count] = [nil, nil, nil, nil, nil, nil, nil, nil,]
  end
  count += 1
end
board

在我的第 4 行,我想做类似

的事情
board[count] = (8.times { board[count] << nil })

我知道差不多一样长。我只是好奇或者想理清我的逻辑...谢谢!!

尝试使用Array的构造函数

Array.new(8)
 => [nil, nil, nil, nil, nil, nil, nil, nil] 

Array.new(8, 42)
 => [42, 42, 42, 42, 42, 42, 42, 42] 

如果您需要一个对象并且不希望每个实例都相同,则传递一个块

Array.new(8) { Hash.new }
 => [{}, {}, {}, {}, {}, {}, {}, {}] 

你可以这样做

board[count] = [nil]*8

除了赋值缩短为board[count] = Array.new(8),其他部分也可以写得更简洁:

if x == nil
  x = ...
end

这是一个很常见的模式。它通常可以写成:

x ||= ...

如果 xfalsey,即 nilfalse.

在你的例子中它变成了:

board[count] ||= Array.new(8)

显式计数器变量也可以通过使用Array#each_index来避免。这会将您的整个 until 块缩小为:

board.each_index { |i| board[i] ||= Array.new(8) }

要删除索引,您还可以使用 map!:

board.map! { |e| e || Array.new(8) }

这会将每个元素 e 替换为块的结果,即只是 e 或 – 如果 efalsey – 8 nils.

的数组

如果您想要创建一个 two-dimensional 大小为 n 的数组 m 填充值 x:

Array.new(n) { Array.new(m, x) }

因此,在您的情况下,您可以将代码调整为:

Array.new(count) { Array.new(8) }

数组中的默认值为 nil