《Solidity 教程》運算

涉及 LValues 的運算子

如果 a是一個 LValue(即一個變數或者其它可以被賦值的東西),以下運算符都可以使用簡寫:

a += e 等同於 a = a + e。 其它運算子 -=*=/=%=|=&= 以及 ^=都是如此定義的。a++a--分別等同於 a += 1a -= 1,但表達式本身的值等於 a在計算之前的值。 與之相反,--a++a雖然最終a 的結果與之前的表達式相同,但表達式的返回值是計算之後的值

delete

delete a 的結果是將類型初始值賦值給 a

  • 對於整型變數來說,相當於 a=0
  • delete 也適用於陣列,對於動態陣列來說,是將重置為陣列長度為0的陣列,而對於靜態陣列來說,是將陣列中的所有元素重置為初始值,對陣列而言, delete a[x]僅刪除陣列索引處x的元素,其他的元素和長度不變,這以為著陣列中留出了一個空位。
  • 如果打算刪除項,映射可能是更好的選擇。
  • 如果對象a 是結構體,則將結構體中的所有屬性(成員)重置

換句話說,在 delete a之後的值與在沒有賦值的情況下聲明 a的情況相同, 但需要注意以下幾點:

  • delete 對整個映射是無效的(因為映射的鍵可以是任意的,通常也是未知的)。 因此在你刪除一個結構體時,結果將重置所有的非映射屬性(成員),這個過程是遞歸進行的,除非它們是映射。 然而,單個的鍵及其映射的值是可以被刪除的
  • 理解delete a 的效果就像是給 a賦值很重要,換句話說,這相當於在a 中存儲了一個新的物件
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;

contract DeleteExample {
    uint data;
    uint[] dataArray;

    function f() public {
        uint x = data;
        delete x; // sets x to 0, does not affect data
        delete data; // sets data to 0, does not affect x
        uint[] storage y = dataArray;
        delete dataArray; 
				// this sets dataArray.length to zero, but as uint[] is a complex object, also
        // y is affected which is an alias to the storage object
        // On the other hand: "delete y" is not valid, as assignments to local variables
        // referencing storage objects can only be made from existing storage objects.
        assert(y.length == 0);
    }
}
Subscribe to Samumu.eth
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.