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

相关推荐
TOPGUS1 天前
谷歌SEO第三季度点击率趋势:榜首统治力的衰退与流量的去中心化趋势
大数据·人工智能·搜索引擎·去中心化·区块链·seo·数字营销
中金快讯1 天前
区块链宕机致爆仓提现延迟成常态,Matrixdock交易平台能扛住重压吗?
区块链
devmoon1 天前
Polkadot SDK 平行链模板搭建全流程指南
web3·区块链·sdk·比特币·波卡
China_Yanhy1 天前
入职 Web3 运维日记 · 第 8 日:黑暗森林 —— 对抗 MEV 机器人的“三明治攻击”
运维·机器人·web3
Max_uuc1 天前
【C++ 硬核】利用链接器魔法 (Linker Sections) 实现“去中心化”的自动初始化与插件系统
去中心化·区块链
devmoon1 天前
在 Polkadot 上部署独立区块链Paseo 测试网实战部署指南
开发语言·安全·区块链·polkadot·erc-20·测试网·独立链
傻小胖1 天前
22.ETH-智能合约-北大肖臻老师客堂笔记
笔记·区块链·智能合约
傻小胖2 天前
21.ETH-权益证明-北大肖臻老师客堂笔记
笔记·区块链
硅基流动2 天前
硅基流动 × ValueCell:8K+Star,去中心化金融智能体加速投资决策
金融·去中心化·区块链
devmoon2 天前
使用 Hardhat 在 Polkadot Hub 测试网部署基础 Solidity 合约(完整实战指南)
web3·区块链·智能合约·波卡·hardhat