En este tutorial vamos a aprender cuáles son los diferentes bucles que puedes usar en Solidity. En general los bucles que encontrarás en Solidity son los mismos que existen en otros lenguajes de programación como JavaScript, Python o PHP. Es decir, los bucles while
, for
y sus variantes.
A continuación vamos a ver cuáles son las diferentes estructuras de control que puedes usar para crear bucles en Solidity.
El bucle for
El bucle for
te permite ejecutar un bloque de código mientras se cumpla una determinada condición. Se suele usar para iterar colecciones de elementos. Se define con la sentencia for
seguida de un paréntesis de apertura y otro de cierre. Seguidamente se incluyen las llaves de apertura y cierre del bucle. Entre el paréntesis de apertura y el de cierre se incluyen la siguientes sentencias, separadas por punto y coma:
- Inicialización del bucle: Aquí inicializamos un contador. Esta sentencia se ejecuta antes de la primera iteración del bucle.
- Sentencia de comprobación del bucle: Comprobamos si una condición específica es verdadera o falsa. Si la condición es verdadera, entonces se ejecutará el código del ciclo que incluyamos entre las llaves de apertura y cierre de la estructura. De lo contrario finaliza el bucle.
- Sentencia de iteración del bucle: En donde aumentamos o reducimos el valor del contador.
La sintaxis del bucle for
se podría definir tal que así:
for (inicialización; condición; iteración) {
// Sentencias que se ejecutan si se cumple la condición
}
En el siguiente ejemplo inicializamos el contador i
a 0
y ejecutamos el bucle mientras i
sea menor que 10
, sumando una unidad a i
con cada iteración. El bucle for
se ejecutará un total de 10 veces:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
for (uint i = 0; i < 10; i++) {
numero++;
}
return numero;
}
}
Existen dos sentencias especiales que se usan para alterar el estado de ejecución del bucle. Estas sentencias son la sentencia break
y la sentencia continue
. La sentencia break
rompe el bucle, finalizando su ejecución. La sentencia continue
permite saltar a la siguiente iteración del bucle en cualquier instante.
En el siguiente ejemplo usamos la sentencia break
para finalizar la ejecución del bucle cuando el valor de numero
sea 3, retornando dicho valor:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
for (uint i = 0; i < 10; i++) {
if (numero == 3) {
break;
}
numero++;
}
return numero;
}
}
En el siguiente ejemplo nos saltamos la segunda y la tercera iteración usando la sentencia continue
, por lo que la función devolverá el valor 8
:
pragma solidity ^0.8.13;
contract MiContrato
{
uint valor;
function suma() external pure returns(uint)
{
uint numero = 0;
for (uint i = 0; i < 10; i++) {
if (i == 2 || i == 3) {
continue;
}
numero++;
}
return numero;
}
}
El bucle while
En bucle while
es muy parecido al bucle for
. Sin embargo, en un bucle while
solamente necesitamos especificar la condición que se tendrá que cumplir para que se ejecute el bucle.
La sintaxis del bucle while
se podría definir así:
while (condición) {
// Sentencias
}
En el siguiente ejemplo, el bucle while
se ejecutará mientras la variable numero
sea menor que 10:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
while (numero < 10) {
numero++;
}
return numero;
}
}
Es importante tener en cuenta de que si establecemos una condición que nunca se vaya a cumplir, el bucle se ejecutará ilimitadamente. Esto es algo poco deseable.
La sentencias break
y continue
también están disponibles en el bucle while
. En el siguiente ejemplo duplicamos el valor de la variable numero
cuando su valor es 5
, saltándonos la parte en la que sumamos una unidad mediante la sentencia continue
. Del mismo modo, rompemos la ejecución del bucle cuando numero
vale 8
:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
uint duplicarEn = 5;
while (numero < 10) {
if (numero == duplicarEn) {
numero = numero * 2;
continue;
}
if (numero == 8) {
break;
}
numero++;
}
return numero;
}
}
El bucle do while
En bucle do while
es similar al bucle while
. Mientras que en un bucle while
comprobamos la condición antes de ejecutar el bucle, en un bucle do while
primero se ejecuta el bucle y luego se comprueba la condición. La ejecución continuará mientras se cumpla dicha condición.
La sintaxis del bucle while
se podría definir así:
do {
// Sentencias
} while (condición);
En el siguiente ejemplo, el bucle do while
se ejecutará mientras la variable numero
sea menor que menor que 10:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
do {
numero++;
} while (numero < 10);
return numero;
}
}
En este caso, el bucle se ejecutará una vez más que en el ejemplo expuesto para el bucle while
.
Al igual que ocurre con los todos bucles, las sentencias break
y continue
también están disponibles en el bucle do while
. En el siguiente ejemplo duplicamos el valor de la variable numero
cuando su valor es 5
, saltándonos la parte en la que sumamos una unidad mediante la sentencia continue
. Del mismo modo, rompemos la ejecución del bucle mediante la sentencia break
cuando numero vale 8
:
pragma solidity ^0.8.13;
contract MiContrato
{
function suma() external pure returns(uint)
{
uint numero = 0;
uint duplicarEn = 5;
do {
if (numero == duplicarEn) {
numero = numero * 2;
continue;
}
if (numero == 8) {
break;
}
numero++;
} while (numero < 10);
return numero;
}
}
Esto ha sido todo.