En Ruby un array es una coleccion de referencias a objetos, la referencia se hace mediante un indice numerico entero. Comencemos viendo como crear un array.
Crear un array
Una de las formas de crear un Array en Ruby es usar square brackets(los corchetes), simplemente ponemos los elementos separados por coma(si es mas de uno):
lista1 = [ ] # array vacio
lista2 = [ 1, 3, 5, 7, 11 ] # array con elementos tipo Fixnum
lista3 = [ 8, 'manzana', 3.14 ] # con distintos tipos de objetos (Fixnum, String, Float)
p lista1, lista2, lista3 # uso 'p' en vez de 'puts' para inspeccionar
[]
[1, 3, 5, 7, 11]
[8, "manzana", 3.14]
Otra forma es usando Array.new:
lista1 = Array.new # array vacio
lista2 = Array.new(5) # array con 5 elementos
lista3 = Array.new(3, 'test') # array con 3 elementos
p lista1, lista2, lista3
[]
[nil, nil, nil, nil, nil]
["test", "test", "test"]
Aca pueden notar que por defecto el array lista2 se llena de objetos nil ya que no se le ha dado un valor por defecto como en lista3.
Tambien existe un atajo para crear un array con valores tipo String, por ejemplo:
colores1 = [ 'rojo', 'verde', 'azul', 'amarillo' ] # usando brackets
colores2 = %w{ rojo verde azul amarillo } # usando el atajo %w
p colores1, colores2
["rojo", "verde", "azul", "amarillo"]
["rojo", "verde", "azul", "amarillo"]
Como ven son equivalentes, este atajo nos ahorra la tediosa tarea de escribir las comillas para cada elemento.
Cantidad de elementos en un array
Para conocer la cantidad de elementos en un array tenemos dos metodos, size y length:
nada = []
nums = [1, 3, 5, 7]
puts nada.size, nums.size # tambien puedo usar 'length'
0
4
Acceder a los objetos
Para acceder a un elemento en particular se puede hacer mediante su indice, en ruby los indices parten desde 0:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
puts colores[0] # el indice 0 corresponde al primer elemento
puts colores[3] # por tanto el indice 3 corresponde al ultimo elemento
# al usar un indice negativo se cuenta desde el final
puts colores[-1] # el ultimo elemento
puts colores[-2] # el penultimo
rojo
cafe
cafe
verde
Tambien es posible acceder usando el formato [inicio, cantidad] como se muestra:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0,2] # desde el indice 0 mostrar 2
p colores[1,3] # desde el indice 1 mostrar 3
p colores[-2,2] # desde el penultimo mostrar 2
["rojo", "azul"]
["azul", "verde", "cafe"]
["verde", "cafe"]
Una tercera forma es usando rangos, [desde..hasta] o [desde...hasta], por si no se nota la diferencia es un punto. Al usar tres puntos, se excluye al ultimo elemento:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores[0..2] # desde elemento con indice 0 al con indice 2(incluido)
p colores[0...2] # desde elemento con indice 0 al con indice 2(excluido)
# tambien se pueden usar numeros negativos aqui
p colores[-2..-1] # del penultimo al ultimo(incluido)
p colores[0...-1] # del primero al ultimo(excluido)
["rojo", "azul", "verde"]
["rojo", "azul"]
["verde", "cafe"]
["rojo", "azul", "verde"]
Y una forma mas es el uso de los metodos first y last:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
p colores.first # el primero
p colores.first(3) # los primeros 3
p colores.last # el ultimo
p colores.last(2) # los ultimos 2
"rojo"
["rojo", "azul", "verde"]
"cafe"
["verde", "cafe"]
Modificar los objetos
Para modificar un valor en particular:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[2] = 'naranja' # cambio el tercer valor
colores[-1] = 'amarillo' # y el ultimo
p colores
["rojo", "azul", "naranja", "amarillo"]
Tambien puedo usar el mismo formato [indice, largo] para modificar el array:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = 'naranja' # dos elementos a partir del indice 1
p colores
["rojo", "naranja", "cafe"]
Pueden notar que en este caso se redujo el tamaño del array, esto es porque indique que los dos valores a partir del indice 1 se vieran reemplazados por un solo valor ‘naranja’, si quisiera mantener la cantidad deberia usar un array como en el siguiente ejemplo:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo']
p colores
["rojo", "naranja", "amarillo", "cafe"]
Ahora si los dos valores centrales fueron reemplazados por dos nuevos valores. Tambien se podria incrementar el tamaño del array si se quiere:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[1,2] = ['naranja', 'amarillo', 'gris']
p colores
["rojo", "naranja", "amarillo", "gris", "cafe"]
En este caso indique que los dos valores a partir del indice 1 se vieran reemplazados por 3 valores nuevos, esto hizo que el valor ‘cafe’ se desplazara una posicion a la derecha aumentando el tamaño del array.
Esto mismo se puede hacer con los rangos vistos antes, por ejemplo:
colores = [ 'rojo', 'azul', 'verde', 'cafe' ]
colores[0..2] = ['naranja', 'amarillo', 'gris']
p colores
["naranja", "amarillo", "gris", "cafe"]
Aqui el rango indica modificar los primeros tres valores(indices 0 a 2) por tres nuevos valores, por lo que el tamaño del array queda intacto.
Array como una pila (stack, LIFO)
Existen dos metodos que permiten agregar y eliminar elementos desde el final de un array, estos son push y pop respectivamente, veamos un ejemplo:
pila = [] # comienzo con un array vacio
pila.push 'uno'
pila.push 'dos'
pila.push 'tres'
p colores # a esta altura tiene 3 elementos
puts pila.pop # voy quitando desde el ultimo
puts pila.pop
puts pila.pop
p colores
["uno", "dos", "tres"]
tres
dos
uno
[]
El array que comenzo vacio termino vacio debido a que use el metodo pop tres veces, utilize puts para verificar el elemento que es eliminado cada vez que utilizo pop.
Arrays como una cola (queue FIFO)
Tambien existen dos metodos para agregar y remover desde el inicio de un array, estos son unshift y shift, veamos un ejemplo:
colores = [] # comienzo con un array vacio
colores.unshift 'azul'
colores.unshift 'verde'
colores.unshift 'rojo'
p colores # a esta altura tiene 3 elementos
puts colores.shift # voy quitando el primero
puts colores.shift
puts colores.shift
p colores
["rojo", "verde", "azul"]
rojo
verde
azul
[]
Como ven el array resultante es inverso al del ejemplo anterior, pues los nuevos elementos son agregados al inicio del array.
Ahora, para obtener el comportamiento de una cola(queue) es necesario combinar push que agrega los elemento al final y shift que elimina desde el inicio:
cola = []
cola.push 'cliente1'
cola.push 'cliente2'
cola.push 'cliente3'
p cola # el que llego ultimo queda al ultimo
puts cola.shift # el que llego primero se va primero
puts cola.shift
puts cola.shift
p cola
["cliente1", "cliente2", "cliente3"]
cliente1
cliente2
cliente3
[]
Eso seria por esta entrada, para saber mas sobre arrays pueden visitar la documentacion sobre Arrays para Ruby 1.9.
Ultimos comentarios