07. Arrays y Iteradores
¿Vamos a escribir un programa que nos permita escribir tantas palabras como queramos (una por línea, hasta que presionemos Enter en una línea vacía), y luego nos repita las palabras en orden alfabético? Intenta escribir ese programa...
...
¿Lo lograste? Probablemente tuviste algunos problemas. ¿Cómo guardas todas esas palabras? No sabes cuántas serán. No puedes simplemente crear un montón de variables (palabra1, palabra2, etc.), porque el usuario podría escribir más palabras de las que esperabas.
Necesitamos una forma de guardar una lista de cosas, sin saber cuántas cosas son. Necesitamos Arrays (Arreglos).
Un array es simplemente una lista en tu computadora. Cada ranura en la lista actúa como una variable: puedes ver a qué objeto apunta una ranura en particular, y puedes hacer que apunte a un objeto diferente. Vamos a crear un array:
[]
[5]
['Hola', 'Adios']
sabor = 'vainilla'
[89.9, sabor, [true, false]]
Primero tenemos un array vacío, luego un array con un solo número, luego uno con dos strings. A continuación, tenemos una asignación de variable simple; luego un array con tres objetos: un float, la variable sabor, y otro array.
Para ayudarnos a encontrar cosas en arrays, a cada ranura se le da un número de índice. Los programadores (y la mayoría de los lenguajes de programación, incluido Ruby) comienzan a contar desde cero, así que la primera ranura en el array es la ranura cero.
nombres = ['Ada', 'Belle', 'Chris']
puts nombres
puts nombres[0]
puts nombres[1]
puts nombres[2]
puts nombres[3] # Este está fuera de rango.
Ada
Belle
Chris
Ada
Belle
Chris
nil
Vemos que puts nombres imprime cada nombre en el array nombres. Luego usamos nombres[0] para ver qué hay en la "ranura cero", nombres[1] para la "ranura uno", y así sucesivamente. Cuando intentamos nombres[3], Ruby nos dio nil. nil es la forma en que Ruby dice "nada". Cuando intentas acceder a una ranura que no existe, obtienes nil.
El Método each
each (cada) nos permite hacer algo para cada objeto al que apunta el array. Si queremos decir algo agradable sobre cada lenguaje en un array, haríamos esto:
lenguajes = ['English', 'Norwegian', 'Ruby']
lenguajes.each do |lang|
puts '¡Me gusta ' + lang + '!'
puts '¿A ti no?'
end
puts '¡Y escuchemos algo para C++!'
puts '...'
¡Me gusta English!
¿A ti no?
¡Me gusta Norwegian!
¿A ti no?
¡Me gusta Ruby!
¿A ti no?
¡Y escuchemos algo para C++!
...
¿Qué pasó aquí? lenguajes.each es un método que actúa como un bucle. El código entre do y end se ejecuta para cada elemento en el array. La parte |lang| es cómo damos un nombre al objeto actual (el objeto al que each está apuntando en ese momento). La primera vez, lang apunta a 'English', la segunda vez a 'Norwegian', y así sucesivamente.
Esto se llama un Iterador. Los iteradores son como bucles, pero son métodos que actúan sobre listas de cosas.
Más Métodos de Array
Hemos aprendido [], each, y length (que funciona en arrays igual que en strings). También tenemos join, push, pop, y sort.
join (unir) toma un array de strings y las une en una sola string:
comidas = ['alcachofa', 'brioche', 'caramelo']
puts comidas
puts
puts comidas.to_s
puts
puts comidas.join(', ')
puts
puts comidas.join(' :) ') + ' 8)'
alcachofa
brioche
caramelo
["alcachofa", "brioche", "caramelo"]
alcachofa, brioche, caramelo
alcachofa :) brioche :) caramelo 8)
push (empujar) y pop (sacar) son opuestos. push agrega un objeto al final del array, y pop elimina el último objeto del array (y te dice qué objeto era).
favoritos = []
favoritos.push 'lluvia en la ventana'
favoritos.push 'whisky en gatitos'
puts favoritos[0]
puts favoritos.last
puts favoritos.length
puts favoritos.pop
puts favoritos
puts favoritos.length
lluvia en la ventana
whisky en gatitos
2
whisky en gatitos
lluvia en la ventana
1
Algunas Cositas Para Probar
- Escribe el programa que pedimos al principio de este capítulo. Pista: hay un método encantador para arrays llamado
sort(ordenar). ¡Úsalo! - Intenta escribir el programa anterior sin usar el método
sort. Una gran parte de la programación es resolver problemas de ordenamiento. - Reescribe tu programa de Tabla de Contenidos (del capítulo sobre métodos). Comienza el programa con un array que contenga toda la información para tu Tabla de Contenidos (nombres de capítulos, números de página, etc.). Luego imprímelo todo en un bucle bellamente formateado.
Ahora que hemos aprendido sobre arrays e iteradores, ¡estamos listos para comenzar a escribir nuestros propios métodos!