有没有办法重构这段代码?第一个片段是我现在拥有的,第二个是我想要制作的逻辑。
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 })
我知道这只是一段时间。我只是好奇或者想要清除我的逻辑......谢谢!!
答案 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
,即nil
或false
。
在你的例子中它变为:
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
。