文章介绍了在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;
}
}
练习问题
请查看我们的 Solidity bootcamp,以了解更多智能合约开发和代币标准知识。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!