共计 1359 个字符,预计需要花费 4 分钟才能阅读完成。
简介
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…