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

时间:2017-01-26 16:25:09

标签: arrays ruby refactoring arrayofarrays

有没有办法重构这段代码?第一个片段是我现在拥有的,第二个是我想要制作的逻辑。

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 })

我知道这只是一段时间。我只是好奇或者想要清除我的逻辑......谢谢!!

4 个答案:

答案 0 :(得分:8)

尝试使用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 }
 => [{}, {}, {}, {}, {}, {}, {}, {}] 

答案 1 :(得分:1)

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

if x == nil
  x = ...
end

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

x ||= ...

如果x falsey ,则会将右侧分配给x,即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或 - 如果e falsey - 数组为8 { {1}}秒。

答案 2 :(得分:0)

你可以这样做

board[count] = [nil]*8

答案 3 :(得分:0)

如果您希望制作一个大小为n的二维数组,m填充值x

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

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

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

数组中的默认值为nil