okx

Solidity数组详解

时间:2023-06-17|浏览:214

数组是各种编程语言常见的数据类型。在Solidity中,可以支持编译期定长数组和变长数组。类型为T,长度为k的数组可以声明为T[k],而变长数组则声明为T[]。

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技术的研究,更多信息请见作者的个人博客。

热点:数据

欧易

欧易(OKX)

用戶喜愛的交易所

币安

币安(Binance)

已有账号登陆后会弹出下载

« 上一条| 下一条 »
区块链交流群
数藏交流群

合作伙伴

非小号交易所排名-专业的交易行情资讯门户网站,提供区块链比特币行情查询、比特币价格、比特币钱包、比特币智能合约、比特币量化交易策略分析,狗狗币以太坊以太币玩客币雷达币波场环保币柚子币莱特币瑞波币公信宝等虚拟加密电子数字货币价格查询汇率换算,币看比特儿火币网币安网欧易虎符抹茶XMEX合约交易所APP,比特币挖矿金色财经巴比特范非小号资讯平台。
非小号行情 yonghaoka.cn 飞鸟用好卡 ©2020-2024版权所有 桂ICP备18005582号-1