From: Josh Cheek Date: 2010-03-19T13:12:07+09:00 Subject: Re: problem making an array of arrays (of arrays) --001636b2ad29d9b7cb04821f8cd1 Content-Type: text/plain; charset=ISO-8859-1 On Thu, Mar 18, 2010 at 6:26 PM, Cec Tre wrote: > Hey, bit of a ruby noob here :) > > First, hello ruby-forum community. > > So, here is my problem. I want to create a 5x5 grid, however, each of > the 'cells' in the grid should be able to hold a variety of values. > > Firstly, I started off with this: > > @row_1 = ['x','x','x','x','x'] > @row_2 = ['x','x','x','x','x'] > @row_3 = ['x','x','x','x','x'] > @row_4 = ['x','x','x','x','x'] > @row_5 = ['x','x','x','x','x'] > @grid = [@row_1,@row_2,@row_3,@row_4,@row_5] > > So, obviously this creates a 5x5 grid, in which each of the 'cells' or > @row_1..5[1..5] == 'x'. > > I used to just alter the string value in each cell by using: > > @grid[y][x] = 'new string' > > But, I ultimately want each cell to be an array.. So that I can push and > pop their values as they change, and then the grid will always display > the last value in the array, by using: > > @row_1 = [array.last,array1.last,array2.last,array3.last] > #etc etc etc... > > My problem then is, that I have a different variable name for each of > the five points in each of the five rows. > > So, the solution I really want is: > > Is it possible to have a variable called, say... cellxx ... Then, some > piece of code that alters the xx part of the actual variable name > itself? > > Because, I'm going about implementing cell00, cell01, cell02, cell03 etc > etc each as an array and my code is getting messy. > > Please is there an (easier) way, to do what I want? > > Sorry for the length of this, you can tell i'm new to ruby :) Thanks! > -- > Posted via http://www.ruby-forum.com/. > > Personally, I think I would opt for nested classes in this case, but if I understand your problem correctly, then this should do what you are asking. # the 2d array of elements that are arrays # each currently containing it's yx location as a string array = [[["00"], ["01"], ["02"], ["03"], ["04"]], [["10"], ["11"], ["12"], ["13"], ["14"]], [["20"], ["21"], ["22"], ["23"], ["24"]], [["30"], ["31"], ["32"], ["33"], ["34"]], [["40"], ["41"], ["42"], ["43"], ["44"]]] # go through the array and set variables to reference the individual cells array.each_with_index do |row,y| row.each_with_index do |element,x| instance_variable_set "@array#{y}#{x}" , element end end # show that we can access it as you describe @array00 << 'a' @array01 << 'b' @array11 << 'c' @array22 << 'd' @array33 << 'e' @array43 << 'f' @array44 << 'g' # format the output so that it is easier to see what we did puts '[' array.each do |row| print ' [ ' row.each do |col| printf '%-12s , ' , col.inspect end puts ' ]' end puts ']' --001636b2ad29d9b7cb04821f8cd1--