Michael Durrant
Michael Durrant

Reputation: 96484

Ruby - How to populate a 2d array?

I have this rspec test:

  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

For this code:

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

but I'm getting:

  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)>'

how can I fix this?

btw pawns in every space is not the final result but it's what I want for this test right now (then I can modify it further).

Upvotes: 0

Views: 2469

Answers (3)

vh5
vh5

Reputation: 161

class ChessBoard
   def populate_new_board
      @board = [['pawn'] * 7] * 7
   end
end

Upvotes: 3

Малъ Скрылевъ
Малъ Скрылевъ

Reputation: 16507

As it was denoted that you did a mistake in range, but a strongly advice you to reduce usage of index ranges. You can use :each, and :map methods instead:

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

   def populate_new_board
      @board.each {| row | row.map! {| _ | 'pawn' } }
   end
end

But I'd use more the simple code:

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

Upvotes: 0

sawa
sawa

Reputation: 168101

Change it to:

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

Upvotes: 1

Related Questions