资讯专栏INFORMATION COLUMN

solidity的delete操作汇总

Eminjannn / 1686人阅读

摘要:删除枚举类型时,会将其值重置为序号为的值。删除结构体删除结构体,会将所有成员变量置为初值。删除数组对于定长数组,删除时,是将数组内所有元素置为初值。注意事项删除的本质是初始化变量。但可对其引用的对象进行操作。

简介

Solidity中的特殊操作符delete用于释放空间,为鼓励主动对空间的回收,释放空间将会返还一些gas。

delete操作符可以用于任何变量,将其设置成默认值0。

删除枚举类型时,会将其值重置为序号为0的值。

如果对动态数组使用delete,则删除所有元素,其长度变为0。

如果对静态数组使用delete,则重置所有索引。

如果对map类型使用delete,什么都不会发生。

如果对map类型中的一个键使用delete,则会删除与该键相关的值。

删除基本类型

使用delete删除基本类型会设置为对应的初始值。

pragma solidity ^0.5.10;

contract DeleteDemo{
    
    bool public b  = true;
    uint public i = 1; 
    address public addr = msg.sender;
    bytes public varByte = "123";
    string  public str = "abc";
    enum Color{RED,GREEN,YELLOW}
    Color public color = Color.GREEN;
    
    function deleteAttr() public {
        delete b; // false
        delete i; // 0
        delete addr; // 0x0
        delete varByte; // 0x
        delete str; // ""
        delete color;//Color.RED
    }
}
删除结构体

删除结构体,会将所有成员变量置为初值。

struct Person{
    string name;
    uint age;
}

Person public p = Person("zhangsan",21);
function deletePerson() public{
    delete p;
}

调用改方法之后,结构体Person的name将变为空,age将变为0。

删除mapping

映射是一个特殊的存在,由于映射的键并不总是能有效遍历,所以不能直接删除一个映射。如果直接删除一个映射会报错Unary operator delete cannot be applied。但可以指定键来删除映射中的某一项。

mapping[msg.sender] = 1;
//可以按key删除映射 
delete mapping[msg.sender];

如果删除一个结构体时,其中含有映射类型,会跳过映射类型。也就是说,结构体的其他内容会被初始化,而其中mapping中的内容不会改变。

删除数组

对于定长数组,删除时,是将数组内所有元素置为初值。

对于变长数组时,则是将长度置为0。

可以删除数组的一个元素,删除一个元素后,数组中对应位置的值会被初始值,其它值不受影响。

删除时gas的处理

删除时忽略映射和删除数组中某个位置的值仅初始化改值而不重组数组都是考虑到节省gas。如果映射或数组非常大的情况下,删除或维护它们将变得非常消耗gas。

清理空间的额外好处是可以获得gas返还,但对无特别意义的数组的整理和删除,只会消耗更多gas,需要在业务实现上进行权衡。

注意事项

删除的本质是初始化变量。所以删除storage的引用时会报错,因为storage的引用并没有自己已分配的存储空间,所以不能对storage的引用直接赋初值。

但可对其引用的对象进行delete操作。

原文链接:http://www.choupangxia.com/20...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75644.html

相关文章

  • 近阶段前端面试问题汇总(css篇)

    摘要:在此记录一下被提问的问题吧论水平也就是初级前端,所以很多问题也是挺简单的。为了直观和调试的方便,我们把属性这么写其实对于作三角形这一目的,边框的风格并不重要,所以在这里不多做研究。 经历了各种选择与被选择之后(其实就是被坑了),最终又离开了平静乃至颓废的划水岗位,重新跳入前端求职的大锅,继续翻腾。在此记录一下被提问的问题吧(论水平也就是初级前端,所以很多问题也是挺简单的)。 css篇:...

    邹强 评论0 收藏0
  • 20 个 CSS 高级技巧汇总

    摘要:当然,如果你的新元素有兄弟元素的话,也可以使用通用的兄弟选择符页面顶部阴影下面这个简单的代码片段可以给网页加上漂亮的顶部阴影效果给添加行高你不需要分别添加到每个标记等。 使用技巧会让人变的越来越懒,没错,我就是想让你变懒。下面是我收集的CSS高级技巧,希望你懒出境界。 1. 黑白图像 这段代码会让你的彩色照片显示为黑白照片,是不是很酷? img.desaturate { fil...

    Java3y 评论0 收藏0
  • 2019前端面试题汇总(主要为Vue)

    摘要:毕业之后就在一直合肥小公司工作,没有老司机没有技术氛围,在技术的道路上我只能独自摸索。于是乎,我果断辞职,在新年开工之际来到杭州,这里的互联网公司应该是合肥的几十倍吧。。。。 毕业之后就在一直合肥小公司工作,没有老司机、没有技术氛围,在技术的道路上我只能独自摸索。老板也只会画饼充饥,前途一片迷茫看不到任何希望。于是乎,我果断辞职,在新年开工之际来到杭州,这里的互联网公司应该是合肥的几十...

    arashicage 评论0 收藏0
  • 关于css兼容性问题及一些常见问题汇总

    摘要:解决办法添加复制内容到剪贴板一行右侧第一个元素有双边距一行左侧第一个元素有双边距在,下,自身没浮动,但是的内容有浮动,下边就会产生一个间隙解决办法给加浮动给加注意当下最小高度问题,和的间隙问题共存的时候,给加浮动才能解决。目前主流浏览器的兼容性做的都比较好了,本文主要针对IE6,7的不兼容问题进行解决。 1.圆盘时钟有浮动存在时,计算一定要精确,不要让内容的宽高超出我们所设置的宽高,IE6下...

    seanlook 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<