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

相关推荐
IvorySQL3 天前
PostgreSQL 日报|内核多项缺陷修复与数据校验补丁推进(8 月 27 日)
数据库·postgresql·区块链
zhanghaha13143 天前
Python进阶教程:19_量化交易 零基础超详细入门教程
区块链
mykj15513 天前
Web3开发系统不是炒币,是互联网的“对账本”逻辑
web3·区块链·rwa·钱包区块链系统开发
MartinYeung54 天前
Uniswap v4 许可池:重塑 DeFi 流动性管理的范式革命
人工智能·区块链
磐链科技4 天前
智能合约开发中的Layer2适配:Rollup、侧链与状态通道实践
区块链·智能合约
Richown5 天前
Three.js 供应链三维可视化:全球物流轨迹、库存热力图与数字孪生的交互呈现
区块链·react
小K讲AI营销5 天前
固态电池战局拆解:机器人为何先于汽车吃到红利
大数据·人工智能·区块链
来了就不要走6 天前
源达财源滚滚APP怎么样?日常炒股能用得上吗?
区块链
网安蟹佬霸6 天前
WebAssembly安全攻防实战:从WASM逆向到漏洞利用
前端·安全·自动化·区块链·智能合约·wasm
磐链科技7 天前
轻量级与模块化:面向移动端的Web3钱包开发框架选型与技术精简策略
web3