In article <3A97F2C0.4030202 / vt.edu>, Roy Patrick Tan  <rtan / vt.edu> wrote:
>Hi, I'm a bit new to Ruby, and I have a couple of questions:
>
>1. How do you instantiate multidimensional arrays?
>For single dimensions, I can do:
>a = Array.new
>a[100] = "foo"
>
>But if I wanted to do 2 dimensions, I currently create a one dimensional 
>array, and if I wanted to enter a new value, I have to check if the row 
>is empty:
>
>a = Array.new
>if a[200] = nil then
>     a[200] = Array.new
>end
>
>a[200][200] = "foo"
>
>Is there a simpler way?
>something like
>a = [][]
>a[300][300] = "goo"
>(which doesn't work...)

Here is the implementation I'm currently using for a 2d array.  This
is different from the last one i posted because this one takes a yield
block and can be used for ... interesting default assignments. =)

class Matrix < Array
        def initialize (rows, columns)
                super(rows)
                self.each_index { |i| 
                        self[i] = Array.new(columns) 
                        self[i].each_index { |j| self[i][j] = yield i, j}
                }
        end
end

Specifically, what I have done with the above is:

	a = Matrix.new(10, 10) { TkVariable.new() }

To get a 10x10 two-dimensional array of TkVariables (suitable for binding
into Tk Widgets, of course. =)


Or if you just want to have a two-dimensional array that is initialized with
a constant (as opposed to nil), 

	b = Matrix.new(rows, columns) { 0 }


The yield block takes two arguments; the row and the column of the current
position, so you could do something more fancy:

	c = Matrix.new(rows, columns) { |i, j| i * j }


Ruby is the most fun I have ever had as a programmar!
Jeremy