18-Solidity8.0-数组删除元素通过移动位置

361 阅读1分钟
pragma solidity ^0.8.7;

contract ArrayShift{
    uint [] public arr;

    function example() public {
        arr = [1, 2, 3];
        delete arr[1]; // [1, 0, 3]
    }

    // [1, 2, 3]  remove(1) --> [1, 3, 3] --> [1, 3]
    // [1, 2, 3, 4, 5, 6]  remove(2) --> [1, 2, 4, 5, 6, 6]-->[1, 2, 4, 5, 6]
    // [1] remove(0) --> [1] --> []

    function remove(uint _index) public {
        require(_index < arr.length, "index out of bound");

        for (uint i = _index; i < arr.length -1; i++){
            arr[i] = arr[i + 1];
        }
        arr.pop();
    }

    function test() external {
        arr = [1, 2, 3, 4, 5];
        remove(2);
        // delete(2);

        assert(arr[0] == 1);
        assert(arr[1] == 2);
        assert(arr[2] == 4);
        assert(arr[3] == 5);
        assert(arr.length == 4);

        arr=[1];
        remove(0);
        // delete(0);
        //[]
        assert(arr.length == 0);
    }
}