前提提要
如需本文章中任何源代码欢迎访问博主GitHub
solidity语言库 点击左边即可访问 获取源代码不求人 ~
Solidity 中数组的使用规则
在 Solidity 中,数组是一种基本的数据结构,用于存储多个元素。数组可以是固定大小的(uint[]
),也可以是动态大小的(uint[] memory
或 uint[] storage
)。以下是一些在 Solidity 中使用数组时需要遵守的规则和最佳实践:
1. 声明数组
在 Solidity 中声明数组,可以使用以下语法:
uint[] public myArray; // 动态大小数组
uint[10] public myFixedArray; // 固定大小数组,长度为10
2. 初始化数组
对于动态大小的数组,可以使用 new
关键字进行初始化:
uint[] memory myArray = new uint[](10); // 初始化一个长度为10的动态数组
对于固定大小的数组,不需要显式初始化。
3. 访问数组元素
访问数组元素时,使用方括号 []
:
uint firstElement = myArray[0]; // 访问第一个元素
4. 修改数组元素
可以直接赋值来修改数组元素:
myArray[0] = 100; // 将第一个元素设置为100
5. 动态数组的长度
对于动态数组,可以使用 .length
属性来获取数组的长度:
uint arrayLength = myArray.length; // 获取数组长度
6. 动态数组的内存管理
当在函数中使用动态数组时,需要指定数组是在内存(memory
)还是在存储(storage
):
memory
:数组只在函数调用期间存在,不占用区块链存储。storage
:数组存储在区块链上,占用存储空间。
function pushElement(uint[] storage arr, uint value) public {
arr.push(value); // 将值添加到存储数组
}
function getArray(uint[] memory arr) public pure returns (uint[] memory) {
return arr; // 从函数返回内存数组
}
7. 复制数组
复制数组时,需要使用 copy
函数或者手动复制每个元素:
uint[] memory newArr = copyArray(myArray); // 使用自定义的 copy 函数复制数组
function copyArray(uint[] memory original) internal pure returns (uint[] memory) {
uint[] memory copy = new uint[](original.length);
for (uint i = 0; i < original.length; i++) {
copy[i] = original[i];
}
return copy;
}
8. 避免常见错误
- 不要使用
.length
作为数组索引,这会导致编译错误。 - 确保在使用数组之前已经正确初始化。
- 注意动态数组和固定数组的性能差异,特别是在循环中。
9.总体举例
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
//数组:动态数组,固定长度的定向数组
//包括插入,修改,删除,弹出,通过函数来返回数组
contract Array {
uint[] public nums = [1,2,3]; //定义动态数组,设置了初始值
uint[3] public numsFixed = [4,5,6]; // 定义定向数组,设置了初始值,3是它的数组长度,
function examples() external {
nums.push(4); //动态数组可以通过push的方法推入数据,这里在尾部推入了4,定长数组不可以采用push
uint x = nums[1];
//通过索引访问数组的值,数字代表索引位置,从0开始,uint1会索引成数字2
nums[2] = 777;
//通过索引把第二个值修改为了777,把数组的元素修改
delete nums[1];
//删除索引,删除并不会修改了数组的长度,所以他会把索引为1的值修改为默认值,默认为0
nums.pop();
//采用pop会弹出数组中最后一个值,弹出之后数组会变短,最后一个元素4会被弹出
uint len = nums.length;
//采用len可以获取到数组的长度
uint[] memory a = new uint[] (5);
//在内存中创建数组,写上一个uint,新的数组还要定义长度
//在内存中不能使用pop或者push,只能够通过索引进行修改值
//内存中局部变量只能够定义定长数组,而动态数组只能够存在于状态变量中
a[1] = 123;
}
function returnArray() external view returns (uint[] memory) {
return nums;
}
//把数组中所有元素返回
}
结论
在 Solidity 中使用数组时,了解其声明、初始化、访问和修改的规则是非常重要的。遵循这些规则可以帮助你编写更安全、更高效的智能合约代码。始终记得考虑存储和内存管理,以及如何有效地处理数组,以确保合约的可扩展性和性能。