将八个对象铲入每个数组索引 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 中你不需要保留计数器。您可以使用eachmap 轻松迭代列表。因此,虽然@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 ||= ...

如果xfalsey,即nilfalse,这会将右侧分配给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 或者 - 如果 efalsey - 一个由 8 个 nils 组成的数组。

【讨论】:

【参考方案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 个计数?

如何使用动态索引更新对象数组?

在Ruby中的特定索引处合并数组

找出每个循环中的当前索引(Ruby)[重复]

如何通过敲除映射(ko.utils)向数组中的每个对象添加新属性(索引)?

查找Ruby数组的字符串索引[重复]