Solidity是没有真正能删除元素的方法,只有重置! 例如一个有四个元素的数组,删除其中一个,最后的结果是:数组仍有四个元素,只是被删除的元素会被重置为初始值。
涉及到delete的用法,简单地总结和举点小例子。
delete操作符可以用于任何变量,将其设置成默认值。
删除字符串时,会将其值重置为空。
删除枚举类型时,会将其值重置为序号为0的值。
如果对动态数组使用delete,则删除所有元素,其长度变为0。
如果对静态数组使用delete,则重置所有索引。
如果对map类型使用delete,什么都不会发生。
如果对map类型中的一个键使用delete,则会删除与该键相关的值。
eg:
uint256 public number = 20;
address[] public addrs;
delete number;
//number = 0;
delete addrs[1];
//addrs[1] = address(0); delete将对应数组中的元素重置为0地址。
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
}
}
从上面的例子中可以看出,Solidity并不能把一个元素删除得无影无踪的,delete只是相当于赋初值的意思。在实际的运用中,要注意到这些基本的逻辑。