将八个对象铲到每个数组索引 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 ||= ...
如果 x
是 falsey,即 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 nil
s.
的数组
如果您想要创建一个 two-dimensional 大小为 n
的数组 m
填充值 x
:
Array.new(n) { Array.new(m, x) }
因此,在您的情况下,您可以将代码调整为:
Array.new(count) { Array.new(8) }
数组中的默认值为 nil
。
有没有办法重构这段代码?第一个片段是我目前拥有的片段,第二个片段是我正在尝试制作的逻辑。
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 ||= ...
如果 x
是 falsey,即 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 nil
s.
如果您想要创建一个 two-dimensional 大小为 n
的数组 m
填充值 x
:
Array.new(n) { Array.new(m, x) }
因此,在您的情况下,您可以将代码调整为:
Array.new(count) { Array.new(8) }
数组中的默认值为 nil
。