Tutorial de Ruby – Parte 13 – Estructuras de control

Capítulo 9. Estructuras de control

 

Este capítulo explora más sentencias de control de Ruby.

 

9.1. case

 

Se utiliza la sentencia case para comprobar una secuencia de condiciones. Superficialmente se parece al switch de C y Java pero es considerablemente más potente como veremos.

 

ruby> i=8

8

ruby> case i

ruby| when 1, 2..5

ruby| print «1..5\n»

ruby| when 6..10

ruby| print «6..10\n»

ruby| end

6..10

nil

 

2..5 es una expresión que representa un rango entre 2 y 5 inclusive. La siguiente expresión verifica si el valor i cae

dentro del rango:

 

(2..5) === i

 

La sentencia case utiliza internamente el operador === para verificar las distintas condiciones. Dentro de la naturaleza orientada a objetos de Ruby, === lo interpreta el objeto que aparece en la condición when. Por ejemplo, el código que sigue comprueba en el primer when la igualdad de cadenas y en el segundo la coincidencia con una expresión regular.

 

ruby> case ’abcdef’

ruby| when ’aaa’, ’bbb’

ruby| print «aaa o bbb\n»

ruby| when /def/

ruby| print «incluye /def/\n»

ruby| end

incluye /def/

nil

9.2. while

Ruby proporciona medios adecuados para la construcción de bucles, aunque veremos en el siguiente capítulo que si se aprende a utilizar los iteradores a menudo hace innecesario su utilización explícita.

 

Un while es un if repetido. Se ha utilizado en nuestros programas acertijo adivina-palabra y en las expresiones regulares (ver el capítulo anterior); allí tomaba la forma while condición … end que rodeaba el código a repetir mientras la condición fuera cierta. Pero while e if se pueden aplicar fácilmente a sentencias individuales:

 

ruby> i = 0

0

ruby> print «Es cero.\n» if i == 0

Es cero.

nil

ruby> print «Es negativo\n» if i < 0

nil

ruby> print «#{i+=1}\n» while i < 3

1

2

3

nil

 

Algunas veces se necesita la condición de comprobación negada. Un unless es un if negado y un until es un while negado. Dejamos estas sentencias para que se experimente con ellas.

 

Existen cuatro formas de interrumpir el progreso de un bucle desde su interior. La primera break, como en C, sale completamente del bucle. La segunda next salta al principio de la siguiente iteración del bucle (se corresponde con la sentencia continue del C). La tercera redo reinicia la iteración en curso. A continuación se muestra un extracto de código en C que ilustra el significado de break, next, y redo:

 

while (condicion) {

label_redo:

goto label_next /*next*/

goto label_break /*break*/

goto label_redo /*redo*/

;

;

label_next:

}

label_break:

;

 

La cuarta forma de salir del interior de un bucle es return. La evaluación de return provoca la salida no sólo del bucle sino también del método que contiene el bucle. Si se le pasa un argumento, lo devolverá como retorno de la llamada al método, si no el retorno será nil.

 

9.3. for

 

Los programadores en C se estarán preguntando cómo se construye un bucle for. En Ruby, el bucle for es mucho más interesante de lo que cabía esperar. El siguiente bucle se ejecuta una vez por cada elemento de la colección. for elem in coleccion

end

 

La colección puede ser un rango de valores (esto es lo que la mayoría de la gente espera cuando se habla de bucles for):

 

ruby> for num in (4..6)

ruby| print num, «\n»

ruby| end

4

5

6

4..6

 

Puede ser cualquier tipo de colección como por ejemplo un array:

 

ruby> for elm in [100,-9.6,»pickle»]

ruby| print «#{elm}\t(#{elm.type})\n»

ruby| end

100 (Fixnum)

-9.6 (Float)

pickle (String)

[100, -9.6, «pickle»]

 

Saliéndonos un poco del tema, for es realmente otra forma de escribir each, el cual es nuestro primer ejemplo de iterador. La siguientes dos estructuras son equivalentes:

 

# Si utilizas C o Java, puedes preferir esta estructura

for i in coleccion

..

end

 

# si utilizas Smalltalk, puedes preferir esta otra

coleccion.each {|i|

}

 

Con frecuencia se puede sustituir los bucles convencionales por iteradores y una vez acostumbrado a utilizarlos es generalmente más sencillo tratar con éstos. Por lo tanto, avancemos y aprendamos más sobre ellos.

Gus Terrera

Apasionado por el agile testing y la ia.

Deja una respuesta