Página original: http://pine.fm/LearnToProgram/?Chapter=07
Escribamos un programa que nos pida que escribamos todas las palabras que queramos (una palabra por linea, y que se detenga hasta que presionemos Enter en una linea en blanco), y después que repita todas las palabras, pero acomodadas en orden alfabético.
Así que… primero… este… podríamos…
Sabes, no creo que podamos hacerlo. Necesitaríamos una manera de guardar una cantidad desconocida de palabras, y como tener un registro de todas ellas para que no se mezclen con otras variables. Necesitaríamos ponerlos en un tipo de lista. Necesitaríamos algún arreglo.
Un arreglo (también conocidos como vectores) son una lista en la computadora. Cada elemento de la lista actuaría como una variable: puedes ver a que objeto apunta cada elemento, y podrías hacer que apuntara a un objeto diferente. Veamos algunos arreglos:
1 2 3 4 5 6 | [] [5] ['Hola', 'Adios'] sabor = 'vainilla' # Esta linea obviamente no es un arreglo... [89.9, sabor, [true, false]] # ... pero esta si. |
Así que, primero, tenemos un arreglo vacío, después tenemos un arreglo con un solo numero y después un arreglo que contiene dos cadenas. A continuación, tenemos una simple asignación, y después un arreglo que contiene tres objetos, el ultimo de los cuales es el arreglo [true, false]. Recuerda que las variables no son objetos, así que nuestro ultimo arreglo realmente esta apuntando a un flotante, una cadena y un arreglo. Aun si fuéramos a cambiar el valor de sabor, no cambiaría el valor en el arreglo.
Para poder encontrar un objeto en particular dentro de un arreglo, cada elemento tiene asignado un numero como indice. Los programadores (al igual que la mayoría de los matemáticos) empiezan a contar desde cero, así que, el primer elemento del arreglo esta en el elemento cero. Aquí vemos como se hace referencia a los objetos en un arreglo:
1 2 3 4 5 6 7 | nombres = ['Ada', 'Belle', 'Chris'] puts nombres puts nombres[0] puts nombres[1] puts nombres[2] puts nombres[3] # Este se encuentra fuera del rango |
Ada Belle Chris Ada Belle Chris nil
Como pueden ver, puts nombres nos regresa cada nombre contenido en el arreglo nombres. Después usamos puts nombres[0] para obtener el “primer” nombre del arreglo, y puts nombres[1] para obtener el “segundo”… Puede parecer confuso al principio, pero te iras acostumbrando. Solo tienes que comenzar a pensar en contar desde cero, y dejar de usar palabras como “primero” y “segundo”.
Finalmente, probamos puts nombres[3], solo para saber que pasaba. ¿Esperabas un error? Algunas veces, cuando haces una pregunta, la pregunta no tiene sentido (al menos para la computadora); y es ahi cuando obtenemos un error. Algunas otras veces, sin embargo, puedes hacer una pregunta y la respuesta es nada. ¿Que hay en el elemento tres? Nada. ¿Que hay en nombres[3]? nil: Es la manera en que Ruby dice “nada”. nil es un objeto especial el cual significa “ningún otro objeto”.
Si todas estas maneras de enumerar los arreglos se te hacen raras, no temas! Algunas veces podemos evitarlas completamente usando diferentes métodos para los arreglos, como este:
El Método each
each nos permite hacer algo (lo que queramos) a cada objeto al que apunte el arreglo. Así que, si por ejemplo, queremos decir algo amable acerca de cada idioma del arreglo de abajo, hacemos lo siguiente:
1 2 3 4 5 6 7 8 9 | idiomas = ['Ingles', 'Aleman', 'Ruby'] idiomas.each do |idioma| puts '¡Adoro el idioma ' + idioma + '!' puts 'Tu no?' end puts 'Ahora digamos lo mismo para C++' puts '...' |
¡Adoro el idioma Ingles! Tu no? ¡Adoro el idioma Aleman! Tu no? ¡Adoro el idioma Ruby! Tu no? Ahora digamos lo mismo para C++ ...
¿Que fue lo que sucedió? Pudimos ir por todos los elementos del arreglo sin usar números. Siendo mas específicos el programa se lee así: Por cada objeto en idiomas(idiomas.each), haz que la variable lang apunte a cada objeto y entonces haz lo que te digo (do |idioma|), hasta que llegues al final (end). (Solo para que lo sepas, C++ es otro lenguaje de programación. Es mucho mas difícil de aprender que Ruby; normalmente, un programa en C++ será mucho mas largo que un programa en Ruby, aunque hagan lo mismo.)
Pudieras pensar que son parecidos a los ciclos que aprendimos antes, y si, es similar. Pero una diferencia muy importante, each es un método, mientras que while, end, do, if y else no lo son. Son una parte fundamental del lenguaje de Ruby, como = o los paréntesis. Algo parecido a los signos de puntuación del español.
Pero each no, each no es mas que otro método para arreglos. Los métodos como each actúan como ciclos y son llamados iteraciones.
Una cosa que hay que tomar en cuenta en las iteraciones es que siempre son seguidas de un do…end. if y while nunca tienen un do cerca, solo usamos do con las iteraciones.
Aquí hay otra iteración, pero no es un método para arreglos, sino para enteros.
1 2 3 | 3.times do puts '¡Hip-Hip-Hurra!' end |
¡Hip-Hip-Hurra! ¡Hip-Hip-Hurra! ¡Hip-Hip-Hurra!
Mas métodos para arreglos
Ya vimos lo que hace each, pero no es el único método para arreglos, hay muchos mas… casi tantos como para las cadenas. De hecho, algunos de ellos (como length, reverse, + y *) funcionan igual que como funcionan para las cadenas, excepto que solo operan dentro de cada elemento y no en las letras de la cadena. Otros, como last y join solo funcionan en arreglos. Y hay otros, como push y pop, que cambian el arreglo. Y, al igual que con los métodos de cadenas, no tienes que aprenderlos de memoria, simplemente con que recuerdes donde leer sobre ellos (aquí mismo :D).
Primero, veamos to_s y join. join funciona de manera parecida a to_s, excepto que este agrega una cadena entre los elementos del arreglo. Veamos con un ejemplo:
comida = ['alcachofa', 'bollo', 'caramelo']
1 2 3 4 5 6 7 8 9 10 11 | puts comida puts puts comida.to_s puts puts comida.join(', ') puts puts comida.join(' :) ') + ' 8)' 200.times do puts [] end |
alcachofa bollo caramelo alcachofabollocaramelo alcachofa, bollo, caramelo alcachofa :) bollo :) caramelo 8)
Como puedes ver, puts trata de manera diferente los arreglos a comparación de los demás objetos: en lugar de llamar puts de una sola vez para el arreglo, lo llama para cada elemento del arreglo. Es por eso que usar puts 200 veces en un arreglo vacío no hace nada, el arreglo no estaría apuntando a nada. (Hacer nada 200 veces sigue siendo no hacer nada.) Intenta usar puts con un arreglo dentro de otro, ¿Sucedió algo inesperado o esperabas que hiciera eso?
¿Te diste cuenta de que cuando quise dejar una linea en blanco solo use puts en lugar de puts ”? Hacen exactamente lo mismo.
Ahora veamos push, pop y last. Los metodos push y pop son opuestos, algo asi como + y -. push agrega un elemento al final del arreglo y pop borra el ultimo objeto (y nos dice lo que era). last es parecido a pop y te dice lo que hay al final del arreglo, excepto que no lo borra. Va de nuevo, push y pop si modifican el arreglo:
1 2 3 4 5 6 7 8 9 10 11 | favoritos = [] favoritos.push 'pedro paramo' favoritos.push '100 años de soledad' puts favoritos[0] puts favoritos.last puts favoritos.length puts favoritos.pop puts favoritos puts favoritos.length |
pedro paramo 100 años de soledad 2 100 años de soledad pedro paramo 1
Algunas cosas para intentar
- Escribe el programa del que se hablo al principio de este capitulo.
Consejo: Hay un fabuloso método para arreglos que nos permite obtener una versión ordenada de un arreglo: sort. Usalo. :D - Intenta escribir el mismo programa SIN usar el método sort. Una gran parte de la programación consiste en resolver problemas, así que practica todo lo que puedas.
- Reescribe el programa de la Tabla de Contenidos (del capitulo de métodos). Comienza el programa con un arreglo que contenga toda la información de la Tabla de Contenidos (nombres de los capítulos, números de pagina, etc.) Y después que nos devuelva un arreglo con la Tabla de Contenido completamente presentable.
Hasta ahora hemos visto una cantidad considerable de métodos. Ahora es tiempo de que aprendamos a escribir nuestros propios métodos.
