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

相关推荐
怒放de生命20104 小时前
web3之Solidity 变量与类型系统:从理解规则到写出合约
web3·区块链
怒放de生命20102 天前
web3场景的女巫攻击(Sybil Attack)是什么?
web3
磐链科技2 天前
IM社交钱包开发成本是多少?影响项目报价、功能配置与开发周期的关键因素分析
区块链·智能合约
IvorySQL2 天前
PostgreSQL 日报| PostgreSQL JDBC 安全更新(10 月 10 日)
数据库·postgresql·区块链
新新学长搞科研3 天前
【会议征稿】第三届数字经济与计算机科学国际学术会议(DECS 2026)
区块链·计算机科学·数字经济
梦帮科技3 天前
【3.0】上线与运维:节点监控、水龙头、区块浏览器与安全清单
运维·安全·web安全·金融·区块链·密码学·安全架构
kjmkq3 天前
区块链项目出海宣发,依托全球Web3垂直媒体快速建立行业背书
web3·区块链·媒体