The Strangeness of Arrays

Because the initialization:

@t = Array.new(5, Array.new(4))
Creates an array with 5 references to the same array object. You
probably expected an array with 5 different Array objects.

You need the block form that creates a default value:

@t = Array.new(5) { Array.new(4) }

You’ll get:

irb(main):001:0> @t = Array.new(5) { Array.new(4) }
=> [[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil],
[nil, nil, nil, nil], [nil, nil, nil, nil]]
irb(main):002:0> @t[1][1] = “1111111”
=> “1111111”
irb(main):003:0> @t
=> [[nil, nil, nil, nil], [nil, “1111111”, nil, nil], [nil, nil, nil,
nil], [nil, nil, nil, nil], [nil, nil, nil, nil]]
irb(main):004:0>

···

-----Original Message-----
From: Roger Bannister [mailto:rdb@icon.co.za]
Sent: Tuesday, 27 April 2004 10:14 AM
To: ruby-talk ML
Subject: The Strangeness of Arrays

Hi

The behaviour below has me completely confuzzled. Why on earth does my
array suddenly have all rows equal to the last row?

Can anyone tell me if this is expected; or if I have to start wearing my

Stupid Hat again.

Thanks
R

irb(main):014:0> @t = Array.new(5, Array.new(4))
=> [[nil, nil, nil, nil], [nil, nil, nil, nil], [nil, nil, nil, nil],
[nil, nil, nil, nil], [nil, nil, nil, nil]]
irb(main):025:0> row = 0
=> 0
irb(main):026:0> while (row <= 4)
irb(main):027:1> column = 0
irb(main):028:1> while (column <= 3)
irb(main):029:2> printf(“.%d,%d: %d. “, column, row, @t[row][column] =
row+column)
irb(main):030:2> column += 1
irb(main):031:2> end
irb(main):032:1> printf(”\n”)
irb(main):033:1> row += 1
irb(main):034:1> end
.0,0: 0. .1,0: 1. .2,0: 2. .3,0: 3.
.0,1: 1. .1,1: 2. .2,1: 3. .3,1: 4.
.0,2: 2. .1,2: 3. .2,2: 4. .3,2: 5.
.0,3: 3. .1,3: 4. .2,3: 5. .3,3: 6.
.0,4: 4. .1,4: 5. .2,4: 6. .3,4: 7.
=> nil
irb(main):035:0> @t
=> [[4, 5, 6, 7], [4, 5, 6, 7], [4, 5, 6, 7], [4, 5, 6, 7], [4, 5, 6,
7]]