【问题标题】:Ruby - How to populate a 2d array?Ruby - 如何填充二维数组?
【发布时间】:2014-01-01 13:37:43
【问题描述】:

我有这个 rspec 测试:

  it 'has a populated chessboard' do
    expect(ChessBoard.new.populate_new_board).to eq [
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn'],
      ['pawn','pawn','pawn','pawn','pawn','pawn','pawn','pawn']]

  end

对于此代码:

class ChessBoard

  def initialize
    @board=Array.new(7){Array.new(7)}
  end

  def populate_new_board
    (0..7).each do |row|
      (0..7).each do |cell|
        @board[row][cell]='pawn'
      end
    end
    @board
  end

end

但我得到了:

  1) least number of moves from x to y has a populated chessboard
     Failure/Error: expect(ChessBoard.new.populate_new_board).to eq [
     NoMethodError:
       undefined method `[]=' for nil:NilClass
     # ./code.rb:10:in `block (2 levels) in populate_new_board'
     # ./code.rb:9:in `each'
     # ./code.rb:9:in `block in populate_new_board'
     # ./code.rb:8:in `each'
     # ./code.rb:8:in `populate_new_board'
     # ./code_spec.rb:12:in `block (2 levels) in <top (required)>'

我该如何解决这个问题?

顺便说一句,每个空间中的棋子不是最终结果,但这是我现在想要的测试(然后我可以进一步修改它)。

【问题讨论】:

  • 尝试填充为Array.new(7){Array.new(7) { 'pawn' } }
  • 您最多索引 7 个而不是 6 个。

标签: ruby arrays rspec multidimensional-array


【解决方案1】:
class ChessBoard
   def populate_new_board
      @board = [['pawn'] * 7] * 7
   end
end

【讨论】:

    【解决方案2】:

    改成:

    def populate_new_board
      (0...7).each do |row|
        (0...7).each do |cell|
          @board[row][cell]='pawn'
        end
      end
      @board
    end
    

    【讨论】:

    • 这显示了我的错误。最后,我实际上将初始化更改为用“8”调用。结果相同,数组大小内的迭代器
    【解决方案3】:

    正如您在范围内犯了一个错误,但强烈建议您减少索引范围的使用。您可以改用:each:map 方法:

    class ChessBoard
       def initialize
          @board = Array.new( 7 ){ Array.new( 7 ) }
       end
    
       def populate_new_board
          @board.each {| row | row.map! {| _ | 'pawn' } }
       end
    end
    

    但我会使用更多简单的代码:

    class ChessBoard
       def populate_new_board
          @board = Array.new( 7 ){Array.new( 7 ) { 'pawn' } }
       end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2016-05-27
      • 2020-08-02
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多