范圍和聲明

2022-05-12 17:34 更新

聲明的變量將具有一個(gè)初始默認(rèn)值,其字節(jié)表示全為零。變量的“默認(rèn)值”是任何類型的典型“零狀態(tài)”。例如,a 的默認(rèn)bool 值為false。uint或int 類型的默認(rèn)值為0。對(duì)于靜態(tài)大小的數(shù)組和bytes1to bytes32,每個(gè)單獨(dú)的元素將被初始化為其類型對(duì)應(yīng)的默認(rèn)值。對(duì)于動(dòng)態(tài)大小的數(shù)組bytes 和string,默認(rèn)值為空數(shù)組或字符串。對(duì)于該enum類型,默認(rèn)值是它的第一個(gè)成員。

Solidity 中的作用域遵循 C99(和許多其他語言)的廣泛作用域規(guī)則:變量從聲明后的那一點(diǎn)到包含聲明的最小塊的末尾都是可見的。作為此規(guī)則的一個(gè)例外,在 for 循環(huán)的初始化部分中聲明的變量僅在 for 循環(huán)結(jié)束之前可見。{ }

類似參數(shù)的變量(函數(shù)參數(shù)、修飾符參數(shù)、catch 參數(shù)……)在后面的代碼塊中可見 - 函數(shù)體/修飾符的函數(shù)和修飾符參數(shù)以及 catch 參數(shù)的 catch 塊。

在代碼塊之外聲明的變量和其他項(xiàng)目,例如函數(shù)、契約、用戶定義的類型等,甚至在聲明之前就可見。這意味著您可以在聲明和遞歸調(diào)用函數(shù)之前使用狀態(tài)變量。

因此,以下示例將在沒有警告的情況下編譯,因?yàn)檫@兩個(gè)變量具有相同的名稱但范圍不相交。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
contract C {
    function minimalScoping() pure public {
        {
            uint same;
            same = 1;
        }

        {
            uint same;
            same = 3;
        }
    }
}

作為 C99 范圍規(guī)則的一個(gè)特殊示例,請注意,在下文中,第一次賦值x將實(shí)際分配外部變量而不是內(nèi)部變量。在任何情況下,您都會(huì)收到有關(guān)外部變量被遮蔽的警告。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
// This will report a warning
contract C {
    function f() pure public returns (uint) {
        uint x = 1;
        {
            x = 2; // this will assign to the outer variable
            uint x;
        }
        return x; // x has value 2
    }
}

警告

在 0.5.0 版本之前,Solidity 遵循與 JavaScript 相同的范圍規(guī)則,也就是說,在函數(shù)內(nèi)任何地方聲明的變量都將在整個(gè)函數(shù)的范圍內(nèi),無論它在哪里聲明。以下示例顯示了一個(gè)用于編譯但從 0.5.0 版本開始導(dǎo)致錯(cuò)誤的代碼片段。

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0 <0.9.0;
// This will not compile
contract C {
    function f() pure public returns (uint) {
        x = 2;
        uint x;
        return x;
    }
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)