3分钟Solidity: 3.2 Array数组

如需获取本内容的最新版本,请参见 Cyfrin.io 上的Array(代码示例)

数组可以具有编译时固定大小或动态大小。

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Array {
    // 初始化数组的几种方法
    uint256[] public arr;
    uint256[] public arr2 = [1, 2, 3];
    // 固定大小的数组,所有元素初始化为0
    uint256[10] public myFixedSizeArr;

    function get(uint256 i) public view returns (uint256) {
        return arr[i];
    }

    // Solidity 可以返回整个数组。
    // 但应避免将此函数用于长度可能无限增长的数组。
    function getArr() public view returns (uint256[] memory) {
        return arr;
    }

    function push(uint256 i) public {
        // 追加到数组
        // 这将使数组长度增加1。
        arr.push(i);
    }

    function pop() public {
        // 从数组中移除最后一个元素
        // 这将使数组长度减少1
        arr.pop();
    }

    function getLength() public view returns (uint256) {
        return arr.length;
    }

    function remove(uint256 index) public {
        // 删除操作不会改变数组的长度。
        // 它会将索引处的值重置为其默认值,
        // 在本例中为0
        delete arr[index];
    }

    function examples() external pure {
        // 在内存中创建数组,只能创建固定大小的数组
        uint256[] memory a = new uint256[](5);

        // 在内存中创建一个嵌套数组
        // b = [[1, 2, 3], [4, 5, 6]]
        uint256[][] memory b = new uint256[][](2);
        for (uint256 i = 0; i < b.length; i++) {
            b[i] = new uint256[](3);
        }
        b[0][0] = 1;
        b[0][1] = 2;
        b[0][2] = 3;
        b[1][0] = 4;
        b[1][1] = 5;
        b[1][2] = 6;
    }
}

Remix Lite 尝试一下

删除数组元素的示例

通过从右向左移动元素来移除数组元素

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract ArrayRemoveByShifting {
    // [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, 2, 3, 4, 5, 6] -- remove(0) --> [2, 3, 4, 5, 6, 6] --> [2, 3, 4, 5, 6]
    // [1] -- remove(0) --> [1] --> []

    uint256[] public arr;

    function remove(uint256 _index) public {
        require(_index < arr.length, "索引越界");

        for (uint256 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);
        // [1, 2, 4, 5]
        assert(arr[0] == 1);
        assert(arr[1] == 2);
        assert(arr[2] == 4);
        assert(arr[3] == 5);
        assert(arr.length == 4);

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

Remix Lite 尝试一下

通过将最后一个元素复制到要删除的位置来移除数组元素

solidity 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract ArrayReplaceFromEnd {
    uint256[] public arr;

    // 删除一个元素会在数组中留下一个空隙。
    // 保持数组紧凑的一个技巧是,将最后一个元素移动到要删除的位置。
    function remove(uint256 index) public {
        // 将最后一个元素移动到要删除的位置
        arr[index] = arr[arr.length - 1];
        // Remove the last element
        arr.pop();
    }

    function test() public {
        arr = [1, 2, 3, 4];

        remove(1);
        // [1, 4, 3]
        assert(arr.length == 3);
        assert(arr[0] == 1);
        assert(arr[1] == 4);
        assert(arr[2] == 3);

        remove(2);
        // [1, 4]
        assert(arr.length == 2);
        assert(arr[0] == 1);
        assert(arr[1] == 4);
    }
}

Remix Lite 尝试一下


END

相关推荐
明月出天山_3 小时前
【金融科技理论与实践】常见知识点汇总——北大软微期末考复习
分布式·科技·金融·区块链·智能合约
麻辣兔变形记3 小时前
永续合约杠杆逻辑全解析:前端、后端和保证金的关系
前端·后端·区块链·智能合约
谈笑也风生20 小时前
浅谈:被称为新基建的区块链(四)
区块链
Dream Algorithm21 小时前
杠杆和合约之间的区别
笔记·区块链
木西1 天前
2025年ERC标准技术地图:开发者的核心协议选型与实战指南
web3·智能合约·solidity
Dream Algorithm1 天前
crypto是什么
区块链
小明的小名叫小明1 天前
Solidity入门(5)-合约实战
区块链·solidity
Dream Algorithm1 天前
Perp DEX是什么
笔记·区块链
焦点链创研究所1 天前
迈向新规模:以太坊的Fusaka升级
区块链