On Sat, Jul 17, 2010 at 5:09 AM, Shawn W_ <shawnw / internode.on.net> wrote:
>
> Does that mean it should work if I wanted to wrap top and bottom, and
> cap left and right, rather than the other way around? I've tried this
> but it also fell over with the same error. I would think that if
> array[100][1] won't work for the reasons you give above, array[1][100]
> should work, returning nil?
>
> Perhaps I could write a custom method for the nil class? Other than
> that, I don't know how to get around this - maybe investigate NArray, or
> add rows top and bottom that are invisible, and absorb all top/bottom
> out of bounds queries.
No, the simplest thing to do is what you've already done - write an
Array2D class to hold your array of arrays, and do some checking when
you dispatch []
class Array2D
attr_reader :rows, :columns
def initialize(m, n)
@rows = m
@columns = n
@array = Array.new(@rows) { Array.new(@columns) }
end
def [](col, row)
i = col % columns
j = row % rows
@array[j][i]
end
def []=(col, row, val)
i = col % columns
j = row % rows
@array[j][i] = val
end
end
you have the actual array, @array, as a private variable, so the only
way to access it is through your Array2D object, and your definitions
of [] and []= make sure it wraps in both directions. ( % is the mod
operator )
If you'd rather return nils for out of bounds:
def [](col, row)
if col < 0 or col > (columns - 1) or row < 0 or row > (rows - 1)
return nil
end
@array[row][col]
end
and then you need to decide what to do when assigning out of bounds.
martin