Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小

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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值