存储中的数组

文章介绍了在Solidity中如何操作存储中的数组,包括添加、删除元素以及获取数组长度等操作,并提供了相关的代码示例和解释。

你可能已经注意到,在我们关于数组的部分中,我们奇怪地省略了

  • 向数组中的索引写入
  • 向数组追加
  • 从数组中弹出

这是因为你很少对作为函数参数提供的数组进行这种操作。

然而,当数组在存储中时,这种操作就更常见。

以下是一些示例代码

    contract ExampleContract {
    uint256[] public myArray;

    function setMyArray(uint256[] calldata newArray) public {
        myArray = newArray;
    }

    function addToArray(uint256 newItem) public {
        myArray.push(newItem);
    }

    function removeFromArray() public {
        myArray.pop();
    }

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

    function getEntireArray() public view returns (uint256[] memory) {
        return myArray;
    }
}

我建议你将此代码复制并粘贴到 remix 中,以便你能对发生的事情有个直观的理解。

调用 setArray,并输入 [1,2,3,4,5,6]

现在调用 getLength(),它返回 6,即数组的长度。

现在调用 addToArray,传入参数 10。再次调用 getLength()。现在它返回 7。

调用 removeFromArray(),然后跟随调用 getLength()。它现在返回 6,如你所期望的那样。

值得注意的是,由于 myArray 是公共的,因此 Remix 会将其显示为可见的函数。这意味着编译器会自动生成一个名为 myArray() 的函数,可以通过该函数读取存储在 myArray 中的值。

但是,它不会返回整个数组。它会要求一个索引,并返回该索引处的值。myArray 函数的行为如下

    function myArray(uint256 index)
    public
    view
    returns (uint256) {
        return myArray[index];
}

然而,函数 getEntireArray() 返回整个数组。

请注意,pop() 不返回值。

删除项目

Solidity 没有方法可以在列表中间删除项目并减少长度一个。以下代码是有效的,但它不会改变列表的长度。

    contract ExampleContract {

uint256[] public myArray;

function removeAt(uint256 index) public {
    delete myArray[index];
    // 将索引处的值设置为零

    // 以下代码等效
    // myArray[index] = 0;

    // 在这两种情况下 myArray.length 都不会改变
    }
}

如果你想删除一个项目并且还要减少长度,你必须进行“弹出和交换”。

这会删除索引参数处的元素,并将其与数组中的最后一个元素交换

    contract ExampleContract {

    uint256[] public myArray;

    function popAndSwap(uint256 index) public {
        uint256 valueAtTheEnd = myArray[myArray.length - 1];
        myArray.pop(); // 减少长度;
        myArray[index] = valueAtTheEnd;
    }
}

Solidity 不能从列表的中间删除,并保留数组的原始顺序。

字符串

字符串的行为类似于数组,除了当它们是公共时返回整个字符串,因为字符串不能被索引(令人困惑,不是吗?)。字符串没有弹出或 length 操作。

    contract ExampleContract {

    string public name;

    function setName(string calldata newName)
            public {
        name = newName;
    }
}

练习问题

ListOfNumbers

InsertInArray

Stack

通过 RareSkills 学习更多

请查看我们的 Solidity bootcamp,以了解更多智能合约开发和代币标准知识。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/