Noticias Weblogs Foros Wiki Código

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

Picando Código

Arrays en Ruby

Septiembre 21st, 2011 - [Enlace local]

Ruby

Ruby

Hoy voy a compartir mis apuntes sobre Arrays en Ruby. Como comentaba en posts anteriores, vengo estudiando con el libro Programming Ruby 1.9: The Pragmatic Programmers’ Guide. Vengo acompañando la lectura con los Ruby Koans, y algunos video tutoriales. Ya repasé lo de Rails For Zombies, y descubrí otro excelente recurso que son los RailsCasts. Vamos a ver si en algún momento tenemos algo escrito en Ruby para compartir :)

Vamos entonces con estructuras de datos de Ruby. Los Arrays y Hashes son dos clases creadas para el manejo de colecciones:

La maestría en estas dos clases es clave para ser un programador Ruby efectivo. Esta maestría puede llevar tiempo, porque ambas clases tienen interfaces muy grandes.

Teniendo en cuenta esta cita del libro, veamos una definición bien específica de qué es un Array en Ruby:

Arrays
Colección de referencias a objetos.

En Ruby, las variables guardan la referencia a un objeto, y no el objeto en sí. Cada referencia a un objeto ocupa una posición en el array identificado por un índice entero.

a = [3.141592, "pi", 42]
a.class		# Array
a.length	# 3
a[0]		# 3.141592
a[3]		# 42
a[15]		# nil
 
b = Array.new
b.class		# Array
b.length	# 0
b[0] = "Uno"
b[1] = "Dos"
b		# ["Uno", "Dos"]

Se indexan los elementos usando el operador [], un método de instancia de la clase Array que puede ser sobrescrito. Llamar a una posición de un entero positivo, retorna el objeto en ese lugar o nil si no hay nada ahí. Con los índices negativos, se cuenta desde el final siendo -1 el último elemento del array, y -array.length el primero.

a = [1,  5,  6, 38, 95]
#    0,  1,  2,  3,  4	índices positivos
#   -5, -4, -3, -2, -1	índices negativos
 
a[-1] 		# 95
a[-3] 		# 6
a[-56]		# nil

Se pueden indexar con un par de números (inicio, cantidad). Esto devuelve un nuevo array con referencias a la cantidad de objetos comenzando en la posición inicio.

a = [1, 5, 6, 38, 95]
a[1,3]		# [5, 6, 38]
a[-3, 2]	# [6, 38]

También se pueden usar rangos. Ruby implementa un objeto para representar rangos como los meses de Enero a Diciembre, secuencias de números y demás. En el caso de los arrays, se usan los rangos que implementan secuencias (también implementan condiciones e intervalos). Estos funcionan así:

1..10
1...10

Cuando se usan los tres puntos, se excluye al último elemento del rango.

De esta manera, podemos acceder a los elementos de un array así:

a = [1, 5, 6, 38, 95]
a[1..3]		# [5, 6, 38]
a[-4..4]	# [5, 6, 38, 95]

El operador [] tiene un operador []= para setear elementos en el array. Si se usa un solo índice entero, el elemento en esa posición se reemplaza con lo que haya a la derecha de la asignación. Si quedan espacios sin asignar en el medio, estos se llenan con nil.

a = [1, 5, 6, 38, 95]
a[1] = 'Stegosaurus'	#[1, 'Stegosaurus', 6, 38, 95]
a[3] = [5, 6]		#[1, 'Stegosaurus', 6, [5, 6], 95]
a[6] = 99		#[1, 'Stegosaurus', 6, [5, 6], 95. nil, 99]

Si el índice de la asignación []= son dos números(un inicio y longitud) o un rango, los dos elementos en el array original son reemplazados por lo que haya a la derecha de la asignación.

a = [1, 5, 6, 38, 95]
a[2,2] = 'Velociraptor'	#[1, 5, 'Velociraptor', 95]
#Si la longitud es 0, se inserta el valor de la derecha antes de la posición de inicio
a[2,0] = 'Nintendo 64'	#[1, 5, 'Nintendo 64', 'Velociraptor', 95]
#Si el valor a asignar es un array, se usan sus elementos en la asignación
a[1,1] = [4, 7, 82]	#[1, 4, 7, 82, 'Nintendo 64', 'Velociraptor', 95]
a[0..3] = []		#['Nintendo 64', 'Velociraptor', 95]
a[5..6] = 'AYBABTU', 98	#['Nintendo 64', 'Velociraptor', 95, nil, nil, 'AYBABTU',  98]

Arrays como pilas y colas

Los arrays implementan las funciones push y pop que agregan y quitan elementos al final del array, por lo que pueden ser usados como pilas (stack):

pila = []
pila.push "Leonardo"
pila.push "Donatello"
pila.push "Raphael"
pila.push "Michelangelo"
 
puts pila.pop	# Michelangelo
puts pila.pop	# Raphael
p pila		# ["Leonardo", "Donatello"]

Los métodos shift y unshift agregan y quitan elementos del principio del Array. Combinando ambos obtenemos una cola FIFO:

cola = []
cola.push "Leonardo"
cola.push "Donatello"
puts cola.shift
puts cola.shift

En este código, los elementos se quitan del array en el orden que fueron insertados. Está bueno ir escribiendo todo esto en el shell interactivo de Ruby (irb), el cual debería estar instalado en su sistema si instalaron Ruby. De esa forma pueden ir comprobando los resultados esperados de cada método y demás.

Otra opción es usar los métodos first y last. Éstos devuelven los elementos pero sin quitarlos del array. Se puede pasar como parámetro la cantidad de elementos que queremos recibir.

Más info:

Comparte: Twitter Identi.ca del.icio.us Google Bookmarks BarraPunto Bitacoras.com Tumblr Print Facebook

» Leer más, comentarios, etc...

Información legal y técnica