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

相关推荐
LedgerNinja15 小时前
WEEX 真实情况如何?交易平台如何判断是否可靠
大数据·人工智能·区块链
卡牌RWA研究院1 天前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
Web3_Daisy1 天前
Pump.fun 与 FOMO 竞争背后的 Meme 市场变局
大数据·人工智能·金融·web3·区块链
磐链科技1 天前
跨链互操作性:打破RWA价值孤岛的终极解决方案
区块链
IvorySQL2 天前
PostgreSQL 日报| PostgreSQL 19 默认 WAL 压缩算法(8 月 8 日)
数据库·postgresql·区块链
北冥you鱼2 天前
DEX 合约接口设计:从核心功能到最佳实践
区块链
大鱼>3 天前
EVM字节码执行引擎深度解析:从Opcodes到Gas计费
区块链
大鱼>3 天前
共识算法:从PBFT到HotStuff的拜占庭容错演进
区块链·php·共识算法
磐链科技4 天前
区块链钱包开发新范式:如何用原生技术打造下一代Web3入口
web3·区块链
水无痕simon4 天前
15 转账对接文档
java·区块链