时间:2023-06-17|浏览:223
1. 创建数组 1.1 字面量 我们可以使用字面量创建数组并隐式创建一个定长数组: ``` uint[3] memory a = [1,2,3]; ``` 需要注意的是,数组元素类型应该刚好能存储的元素类型。例如,[1,2,3]只需要uint8即可存储。但由于我们声明的变量是uint(默认的uint表示的是uint256),所以需要使用uint(1)进行显式的类型转换。而字面量方式声明的数组是定长的,实际长度必须与声明相匹配,否则编译器会报错。例如:Type string memory[1] memory is not implicitly convertible to expected type string memory[2] memory。
1.2 new关键字 对于变长数组,需要使用new关键字来初始化一个数组。例如: ``` uint[] memory a; a = new uint[](2); ``` 在声明前使用下标方式访问将会报错,但我们可以使用new uint[](2)进行初始化。
2. 数据属性和方法 2.1 length属性 数组有一个length属性,表示当前数组长度。可以通过给length赋值调整数组长度。对于storage的变长数组,可以进行长度调整。例如: ``` uint[] storage a; a.length++; ``` 或者使用push方法来隐式扩展数组长度。
对于memory的变长数组,虽然可以通过参数灵活指定大小,但一旦创建,大小不可调整。
2.2 push方法 变长的storage数组和bytes(不包括string)有一个push方法。可以将一个新元素附加到数组末端,返回值为当前长度。例如: ``` uint[] storage a; a.push(1); ``` 同时需要注意的是memory的变长数组不支持push。
2.3 下标 数组可以通过数字下标访问,从0开始。对于大小为2的数组T[2],要访问第二个元素,要使用下标值1。
如果状态变量类型为数组,也可以标记为public类型,从而让Solidity创建一个访问器。例如: ``` uint[] public a; ``` 访问具体的元素时需要输入一个要访问序号的数字。
3. 多维数组 和大多数程序语言一样,多维数据的定义也很类似。例如,我们要创建一个长度为5的uint数组,每个元素又是一个变长数组。将被声明为uint[][5](需要注意的是,与其它语言不同的是,需要反过来定义)。
例如,声明一个二维数组,它是一个变长的数组,里面的每个元素是一个长度为2的数组。要访问这个数组flags,第一个下标为变长数组的序号,第二个下标为长度为2的数组序号: ``` uint[][] flags; uint[] storage f = flags[0]; f.push(1); ```
4. bytes和string bytes和string是一种特殊的数组。bytes类似byte[],但不同的是,在外部函数会进行压缩打包,更省空间,所以应该尽量使用bytes[1]。string类似bytes,但不提供长度和按序号的访问方式。
由于bytes和string是可以自由转换的,可以将字符串s通过bytes(s)转为一个bytes。需要注意的是,通过这种方式访问到的是UTF-8编码的码流,并不是独立的一个个字符。比如,中文编码是多字节、变长的,所以你访问到的很有可能只是其中的一个代码点。另外,bytes支持push方法。
5. 限制 在外部函数中,目前还不能使用多维数组。因为EVM的限制,外部函数不能返回变长数据。可以使用一个非常大的定长数组作为解决办法。
以上就是Solidity数组的内容,希望对大家有所帮助,
作者专注于以太坊(Ethereum)和Solidity技术的研究,更多信息请见作者的个人博客。
热点:数据
用戶喜愛的交易所
已有账号登陆后会弹出下载