¿Cómo clono una estructura en solidez?

Quiero poder activar runTest() y devolver falso. Necesitaría clonar la estructura en algún momento, pero no estoy seguro de cómo hacerlo con solidez. Pensé que pasarlo a otra función como memoria sería un clon, pero el original se modifica.

pragma solidity ^0.4.19;
pragma experimental ABIEncoderV2;
contract Tester {

    struct Foo {
        bool stayFalse;
    }

    function Tester() public {
    }

    function runTest() public constant returns (bool) {
        Foo memory foo;
        return one(foo);
    }

    function one(Foo memory foo) public constant returns (bool){
        Foo memory foobar;
        foobar = two(foo);
        return foo.stayFalse;
    }

    function two(Foo memory bar) public constant returns(Foo) {
        bar.stayFalse = true;
        return bar;
    }

}

Respuestas (1)

No creo que signifique lo que crees que significa.

El problema es que está creando una nueva Fooprueba en ejecución, luego pasándola a one(), luego pasándola a two(), luego cambiándola para two()devolverla a one(), donde la asigna a foobar, luego procede a devolver ni siquiera foobar's, pero el original foo's stayFalse(no es que hubiera ayudado a nadie).

Realmente, el problema es que solo tienes un Foo todo el tiempo, así que hagas lo que hagas, lo cambiarás. En su lugar, debe crear una copia completamente nueva.

Para clonar una estructura, debe crear una nueva con los campos copiados de la anterior.

Ejemplo:

El siguiente ejemplo contiene una clone()función que crea una nueva Foocon los parámetros de la fuente Fooincorporada en ella.

pragma solidity ^0.4.19;
pragma experimental ABIEncoderV2;
contract Tester {
    struct Foo {
        bool stayFalse;
    }

    function Tester() public {
    }

    function runTest() public pure returns (bool, bool) {
        Foo memory foo;
        return one(foo);
    }

    function one(Foo memory foo) public pure returns (bool, bool){
        Foo memory foobar = two(clone(foo));
        return (foo.stayFalse, foobar.stayFalse);
    }

    function two(Foo memory bar) public pure returns (Foo) {
        bar.stayFalse = true;
        return bar;
    }

    function clone(Foo memory from) internal pure returns (Foo memory) {
        return Foo(from.stayFalse);
    }
}