Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小
场景
在写一个可便利,可以随机索引功能的ArraysList的时候,发现无法通过直接更改全局状态数组变量的长度来完成移除一个元素的操作。这让我十分疑惑,因为solidity的文档中描述的内容为
基本类型-数组
创建内存数组
可使用 new 关键字在内存中创建变长数组。 与 存储storage 数组相反的是,你 不能 通过修改成员变量 .length 改变 内存memory 数组的大小。
pragma solidity ^0.4.16;
contract C {
function f(uint len) public pure {
uint[] memory a = new uint[](7);
bytes memory b = new bytes(len);
// 这里我们有 a.length == 7 以及 b.length == len
a[6] = 8;
}
}
文档中所描述的,storage数组是相反的,可以根据修改length来改变数组的容量。
但是当我在编译器中输入
//pool's info
mapping(address => uint) public _poolIndexMap;
address[] public _poolArray;
function removePool(address _pool) public {
require(isPool(_pool),'no exists');
uint index = _poolIndexMap[_pool];
require(index > 0,'invalid index');
if(index < _poolArray.length){
_poolArray[index - 1] = _poolArray[_poolArray.length - 1];
_poolIndexMap[_poolArray[index - 1]] = index;
index = _poolArray.length;
}
delete _poolIndexMap[_pool];
_poolArray.length --; //这一行编译错误,错误提示memory 类型length为只读
}
根据上面的错误提示我在想,不应该啊。全局变量 _poolArray 应该就是storage类型,于是我又换了个写法,address[] storage _poolArray_ = _poolArray;
通过storage
关键字的方式把_poolArray_ 申明为storage
但是发现还是不行。
解决
当我想到中文文档会落后,英文文档版本一段时间时,我把编译的版本从 pragma solidity >=0.7.0 <0.9.0;
实际为0.8.11 改回了 pragma solidity 0.5.0
。随后错误消失了,逻辑功能测试正常。然后用google一会,发现在官方最新的例子中
数组例子remove的删除方式为调用.pop()
。