将八个对象铲入每个数组索引 ruby
Posted
技术标签:
【中文标题】将八个对象铲入每个数组索引 ruby【英文标题】:shovel eight objects into each array index ruby 【发布时间】:2017-01-26 16:25:08 【问题描述】:有没有办法重构这段代码?第一个 sn-p 是我目前拥有的,第二个是我正在尝试生成的逻辑。
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
在我的第四行,我想做类似的事情
board[count] = (8.times board[count] << nil )
我知道它差不多一样长。我只是好奇或想刷新我的逻辑......谢谢!
【问题讨论】:
一般来说,在 Ruby 中你不需要保留计数器。您可以使用each
或map
轻松迭代列表。因此,虽然@Ursus 的答案是正确的,但仅出于教育目的,在第 4 行,您可以执行以下操作:board[count] = (1..8).map nil
。然后可以将其提升到更高的级别:board.map (1..8).map nil
表示整个 sn-p 或其他内容(不确定这是否是预期的行为)。
我注意到您从不接受针对您的问题给出的答案。确保花一些时间检查您的问题并接受最佳答案,因为它们可以解决您的问题。通过这种方式,您可以让社区知道问题已得到解决,同时您会奖励提供解决方案的人的努力
【参考方案1】:
尝试使用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
=> [, , , , , , , ]
【讨论】:
【参考方案2】:除了将赋值缩短为board[count] = Array.new(8)
,其他部分也可以写得更简洁:
if x == nil
x = ...
end
这是一种非常常见的模式。它通常可以写成:
x ||= ...
如果x
是falsey,即nil
或false
,这会将右侧分配给x
。
在您的示例中,它变为:
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 组成的数组。
【讨论】:
【参考方案3】:你可以这样做
board[count] = [nil]*8
【讨论】:
【参考方案4】:如果您要创建一个大小为 n
的二维数组,由 m
填充值 x
:
Array.new(n) Array.new(m, x)
因此,在您的情况下,您可以将代码调整为:
Array.new(count) Array.new(8)
数组中的默认值为nil
。
【讨论】:
以上是关于将八个对象铲入每个数组索引 ruby的主要内容,如果未能解决你的问题,请参考以下文章
如何将对象列表转换为对象列表数组,每个数组索引都有 2 个计数?