1

有没有办法重构这段代码?第一个片段是我目前拥有的,第二个片段是我试图产生的逻辑。

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

4 回答 4

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 }
 => [{}, {}, {}, {}, {}, {}, {}, {}] 
于 2017-01-26T16:26:52.780 回答
1

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

if x == nil
  x = ...
end

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

x ||= ...

这会将右侧分配给xif xis 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要么——如果enil的——一个 8 s的数组。

于 2017-01-26T17:01:15.193 回答
0

如果您希望通过 value 填充来制作一个大小n的二维数组:mx

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

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

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

数组中的默认值为nil.

于 2017-01-26T17:59:19.257 回答
0

你可以这样做

board[count] = [nil]*8
于 2017-01-26T16:43:44.357 回答