Cómo crear una matriz multidimensional en Ruby

Ruby no ofrece soporte explícito para arrays multidimensionales, pero puede implementarlos si conoce lo básico del lenguaje. En esencia, debe crear un "array de arrays" donde cada elemento contiene otro array. Para no repetir código, escriba un método que genere esos arrays anidados.

Crear array multidimensional en Ruby

Paso 1: Esqueleto del método

El método tomará argumentos de dimensión y devolverá array multidimensional vacío de esas dimensiones. Ejemplo: para array 10x10, llame mda(10,10):

def mda(width, height)
end

Paso 2: Crear array de ancho (width)

Cree array con width elementos.

Paso 3: Crear array de alto (height) para cada elemento

Para cada elemento del array anterior, cree array de height elementos. Esto forma el "array de arrays" bidimensional. Use Array.new con longitud como argumento para crear arrays vacíos de longitud específica (inicialmente todos nil).

Paso 4: Usar map! para poblar

El método map! itera cada elemento, ejecuta bloque para cada uno y asigna resultado al elemento. Más conciso que bucle for:

def mda(width, height)
  a = Array.new(width)
  a.map! { Array.new(height) }
  return a
end

Paso 5: Usar el array con subíndices []

Ejemplo: array 10x10 llamado "a", elemento [7][3] → a[7][3]:

a = mda(10,10)
# Llenar array
a[7][5] = "una cadena"
a[2][9] = 23
# Recuperar valores
puts a[7][5]
puts a[2][9]

Paso 6: Encadenar llamadas a métodos

Ruby permite encadenar llamadas. Array.new devuelve array; puede encadenar otro método sobre el array devuelto. Al encadenar, no necesita variable intermedia ni return explícito:

def mda(width, height)
  Array.new(width).map! { Array.new(height) }
end

Consejo

Ruby es muy expresivo. El método MDA puede ser una sola línea concisa. Líneas y palabras clave extra solo complican código. return no es necesario en Ruby: los métodos y bloques devuelven automáticamente el resultado de la última sentencia ejecutada.