【问题标题】:shovel eight objects into each array index ruby将八个对象铲入每个数组索引 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 或其他内容(不确定这是否是预期的行为)。
  • 我注意到您从不接受针对您的问题给出的答案。确保花一些时间检查您的问题并接受最佳答案,因为它们可以解决您的问题。通过这种方式,您可以让社区知道问题已得到解决,同时您会奖励提供解决方案的人的努力

标签: arrays ruby refactoring arrayofarrays


【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-29
          • 2019-08-05
          • 1970-01-01
          • 2017-07-30
          • 2020-10-06
          • 2023-01-23
          • 2012-04-29
          • 2020-08-05
          相关资源
          最近更新 更多