Newbiest ? ever


(Orion Hunter) #1

(ruby 1.8.0 Linux)

I don’t understand why I get the following behavriour:

irb(main):001:0> matrix = Array.new( 3, Array.new( 4, 0 ) )
=> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
irb(main):002:0> matrix[0][0] = 1
=> 1
irb(main):003:0> matrix
=> [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
irb(main):004:0>

I would have expected the assignment of matrix[0][0] to produce a matrix:
[[1,0,0,0],[0,0,0,0][0,0,0,0]]

What am I not getting here?

···

Plan your next US getaway to one of the super destinations here.
http://special.msn.com/local/hotdestinations.armx


(Kent S.) #2

Because, matrix = Array.new( 3, Array.new( 4, 0 ) )
creates an array with three elements all poining to the same array
object. What you need is something like that:

matrix = Array.new( 3 ) { Array.new( 4, 0 ) }

/kent

Orion Hunter wrote:

···

(ruby 1.8.0 Linux)

I don’t understand why I get the following behavriour:

irb(main):001:0> matrix = Array.new( 3, Array.new( 4, 0 ) )
=> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
irb(main):002:0> matrix[0][0] = 1
=> 1
irb(main):003:0> matrix
=> [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
irb(main):004:0>

I would have expected the assignment of matrix[0][0] to produce a matrix:
[[1,0,0,0],[0,0,0,0][0,0,0,0]]

What am I not getting here?


Plan your next US getaway to one of the super destinations here.
http://special.msn.com/local/hotdestinations.armx


(Laurent Julliard) #3

Array.new(num,object) just creates num refernces to object:
irb(main):001:0> a=Array.new(3,‘yo’)
=> [“yo”, “yo”, “yo”]
irb(main):002:0> a[0].id
=> 20896272
irb(main):003:0> a[1].id
=> 20896272

what you want is different object with the same value, you can do this
with:
irb(main):004:0> a=Array.new(3) {‘yo’}
=> [“yo”, “yo”, “yo”]
irb(main):005:0> a[0].id
=> 20863668
irb(main):006:0> a[1].id
=> 20863656

so you should write:

matrix= Array.new(3) do
Array.new(4,0)
end

or just do:
require ‘matrix’
:slight_smile:

···

il Tue, 10 Feb 2004 02:56:28 +0900, “Orion Hunter” orion2480@hotmail.com ha scritto::

(ruby 1.8.0 Linux)

I don’t understand why I get the following behavriour:

irb(main):001:0> matrix = Array.new( 3, Array.new( 4, 0 ) )
=> [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
irb(main):002:0> matrix[0][0] = 1
=> 1
irb(main):003:0> matrix
=> [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
irb(main):004:0>

I would have expected the assignment of matrix[0][0] to produce a matrix:
[[1,0,0,0],[0,0,0,0][0,0,0,0]]

What am I not getting here?