Escapar del bucle con break y continue
Hasta ahora hemos visto estructuras condicionales y repetitivas para controlar el flujo de un programa, pero otra forma de gestionar la secuencia de un programa es través de saltos o interrupciones de ciertos bloques de código. Kotlin tiene tres expresiones principales para romper la estructura secuencial de un programa provocando saltos en la estructura del código:
- return: en general sale de una función y retorna un valor.
- break: detiene la ejecución de un bucle y sale de él, por lo que no se ejecuta el código que se encuentre después en el cuerpo de ese bucle.
- continue: interrumpe una iteración dentro de un bucle (normalmente en base a una condición específica), y vuelve al principio del bucle para realizar otra iteración, si corresponde.
Por ejemplo, podemos detener un bucle en base a una condición:
for (i in 1..10) { if (i > 5) { break // detiene el bucle } print("$i ") // 1 2 3 4 5 }Con este otro ejemplo solo interrumpimos el bucle para los números pares y así obtenemos los números impares del 1 al 10:
for (i in 1..10) { if (i % 2 == 0) { continue // vuelve al inicio del bucle } print("$i ") // 1 3 5 7 9 }Por otra parte, Kotlin permite marcar cualquier expresión con una etiqueta que tienen la forma de un identificador seguido del signo @. Más claro con un ejemplo: en el siguiente código tenemos un bucle for que imprime del 1 al 10:
for (i in 1..10) { print("$i ") }Podemos etiquetar la expresión anterior de la siguiente manera:
bucle@ for (i in 1..10) { print("$i ") }Comprobamos que los dos códigos anteriores tienen el mismo resultado, pero el segundo nos permite calificar las instrucciones break y continue con la etiqueta que hace referencia al bucle, y así podemos especificar a qué expresión se refiere en caso de que break o continue estén contenidas en bloques anidados de más de un bucle:
bucle1@ for (i in 1..4) { bucle2@ for (j in 1..2) { println("i = $i; j = $j") if (i == 2) break@bucle1 } }Puedes comprobar que el resultado de ejecutar este código cambia al cambiar la etiqueta de break a break@bucle2 (aunque como break termina por defecto con el bucle más interno, no sería necesario calificar a break con la etiqueta bucle2). Un ejemplo de continue con una etiqueta:
externo@ for (i in 1..5) { for (j in 1..4) { if (i == 3 || j == 2) continue@externo println("i = $i; j = $j") } }
Comentarios
Publicar un comentario