Bucles en Solidity

Solidity

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.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

Deja una respuesta

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”