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.