Ejemplos para aclarar las asignaciones de almacenamiento frente a la memoria/parámetros de retorno

¿Hay un error en funcB? No entiendo por qué/cuándo mencionar el nombre de la variable del parámetro de retorno en la firma de la función.

contract Foo {

    // State variables go to Storage
    uint[] public foo;  

    function funcA(uint[] x) public returns (uint) { // x is in memory
        foo = x  // x is copied to storage now

        uint a = 100  // a is in storage
        return a
    }

    function funcB(uint[] x) public returns (uint a) { // x is in memory
        a = 100  // a is in memory? because `returns (uint a)`
        return a
    }
}

Además, supongo que funcA es incorrecto pero funcB está bien en el siguiente ejemplo.

contract Foo {

    uint[] public foo;  

    function funcA() public returns (uint[]) { 
        uint a[];
        // push stuff to a
        return a
    }

    function funcB() public returns (uint a[]) {
        // push stuff to a
        return a
    }
}

Respuestas (2)

Mencionar el nombre de la variable de retorno es útil en caso de que desee devolver varios resultados de una función.

Por ejemplo:

function funcA() public returns (uint a,unit b,uint c){
    a = 1;
    b = 2;
    c = 3; 
}

esto generará 3 valores de retorno.

en este caso a está en la memoria. Puede manejar su devolución de DOS maneras

function funcB(uint[] x) public returns (uint a) { // x is in memory
    uint z = 100;
    return z; // or return 100 directly 
}

o

function funcB(uint[] x) public returns (uint a) { // x is in memory
    a = 100;  // you have already assigned a to be 100
    return;
}