Как работает присвоение переменной, расположенной в хранилище? - PullRequest
0 голосов
/ 07 декабря 2018

Я читаю readthedocs Solidity, и в разделе Расположение данных есть этот контракт

pragma solidity >=0.4.0 <0.6.0;

contract C {
    uint[] x; // the data location of x is storage

    // the data location of memoryArray is memory
    function f(uint[] memory memoryArray) public {
        x = memoryArray; // works, copies the whole array to storage
        uint[] storage y = x; // works, assigns a pointer, data location of y is storage
        y[7]; // fine, returns the 8th element
        y.length = 2; // fine, modifies x through y
        delete x; // fine, clears the array, also modifies y
        // The following does not work; it would need to create a new temporary /
        // unnamed array in storage, but storage is "statically" allocated:
        // y = memoryArray;
        // This does not work either, since it would "reset" the pointer, but there
        // is no sensible location it could point to.
        // delete y;
        g(x); // calls g, handing over a reference to x
        h(x); // calls h and creates an independent, temporary copy in memory
    }

    function g(uint[] storage) internal pure {}
    function h(uint[] memory) public pure {}
}

В строке

uint[] storage y = x;

Я бы подумал, что y этоточно такой же тип, как x и, следовательно, ведет себя точно так же, как x, но это не тот случай, как показано в строке

y = memoryArray;

Комментарии в коде сбивают меня с толку.Есть ли четкое объяснение того, как это работает?

...