为什么此数组åˆå§‹åŒ–的行为有所ä¸åŒï¼Ÿ

时间:2014-05-18 20:12:16

标签: ruby arrays initialization

我有

def initialize
  @board = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 
end

我以为我å¯ä»¥ç¼©çŸ­å®ƒï¼š

def initialize
  @board=[ [0] * 4] * 4
end

它们看起æ¥ä¸€æ ·ï¼Œä½†åªæœ‰åŽè€…,我得到一个错误,如:

10) vertical turn can add 1 to an existing column of 2 with 1's at the ends                                             [20/18949]
   Failure/Error: expect([game.board[0][2], game.board[1][2], game.board[2][2], game.board[3][2]]).to eq [0,1,0,0]

     expected: [0, 1, 0, 0]
          got: [1, 1, 0, 1]

     (compared using ==)
   # ./spec/game_spec.rb:132:in `block (2 levels) in <top (required)>'

1 个答案:

答案 0 :(得分:5)

请å°è¯•ä½¿ç”¨æ­¤å·¥ä½œå’Œéžå·¥ä½œä»£ç ï¼š

@board.map { |x| x.object_id }

你会å‘现差异。å‘生错误是因为所有内部数组都是åŒä¸€ä¸ªå¯¹è±¡ã€‚

问题在于

[ [0] * 4 ] * 4

是一个包å«ç›¸åŒæ•°ç»„四次的数组。

虽然

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

是一个包å«å››ä¸ªä¸åŒArray对象的Array。

当你.inspect时,它们看起æ¥æ˜¯ä¸€æ ·çš„,因为Ruby没有å‘你显示对象ID。

实现0-ed数组的å¦ä¸€ç§æ–¹æ³•å¯èƒ½æ˜¯ï¼š

Array.new(4) { Array.new(4) {0} }

或者,如果您åªå¤„ç†4x4整数,那么您å¯ä»¥æŸ¥çœ‹narray库,它没有这些问题,而且批é‡æ“作也éžå¸¸å¿«ã€‚