2

コンウェイのライフ ゲームを作成できるように単純な 10x10 配列を作成しようとしていますが、奇妙な動作が発生します。まず、ボードを初期化します。

@board = Array.new(10, Array.new(10))
(0..9).each do |row|
    (0..9).each do |column|
        @board[row][column] = rand(0..1)
    end
end

これが生成されます:

1000000111
1000000111
1000000111
1000000111
1000000111
1000000111
1000000111
1000000111
1000000111
1000000111
1000000111

怪しいように見えますが、これがランダムに生成される可能性は十分にあります。本当の問題は、個々のセルの値を設定しようとしたときに始まります。値を変更すると、列全体がその値に設定されます! たとえば、最初のセルの値を変更するとします。

@board[0][0] = 0

私が得るものは次のとおりです。

0000000111
0000000111
0000000111
0000000111
0000000111
0000000111
0000000111
0000000111
0000000111
0000000111
0000000111

何を与える?0, 0 のセルだけではなく、列 0 のすべてのセルの値が変わるのはなぜですか?

4

1 に答える 1

5

私はそれを考え出した。で初期化@boardするとArray.new(10, Array.new(10))、10個の同一の配列の配列が作成されました。つまり、各配列には同じ object_id がありました。

@board[0].object_id
=> 22148328
@board[1].object_id
=> 22148328

メソッドを使用して問題を解決しましたmap

@board = Array.new(10).map{ |x| Array.new(10) }
于 2013-04-02T21:30:09.937 に答える