Solidity中如何删除数组中的元素和delete的用法 / 学习智能合约#33

Words
299
Reading
2 min
Listen
Play
6y

delete.jpg

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只是相当于赋初值的意思。在实际的运用中,要注意到这些基本的逻辑。

Solidity中如何删除数组中的元素和delete的用法 / 学习智能合约#33 | Ecency