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

2024-04-18 12:18

本文主要是介绍Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 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 == lena[6] = 8;}
}

文档中所描述的,storage数组是相反的,可以根据修改length来改变数组的容量。
但是当我在编译器中输入

//pool's infomapping(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()

这篇关于Solidity 0.8.10 无法通过更改storage 数组长度改变数组大小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914759

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源