Solidity語言學習筆記————25、作用域和宣告

FLy_鵬程萬里發表於2018-07-02

作用域和宣告(Scoping and Declarations)

  • 已宣告的變數將具有其位元組表示為全0的初始值。
  • 變數的初始值是任何型別的典型“零狀態”(“zero-state)。例如,bool的初始值為falseuintint型別的預設值為0
  • 對於靜態大小的陣列和bytes1bytes32,每個單獨的元素將被初始化為對應於其型別的初始值。
  • 對於動態大小的陣列、bytesstring,初始值是空陣列或空字串。

在函式中任何位置宣告的變數,它的作用域為整個函式,與宣告位置無關。這是因為Solidity繼承了JavaScript的作用域規則。這與許多語言相反——變數僅作用於宣告的地方直到語句塊的末尾為止。 

因此,下面的程式碼是非法的,導致編譯器丟擲一個錯誤,識別符號已經宣告:

// 以下程式碼無法編譯

pragma solidity ^0.4.16;

contract ScopingErrors {
    function scoping() public {
        uint i = 0;

        while (i++ < 1) {
            uint same1 = 0;
        }

        while (i++ < 2) {
            uint same1 = 0;// 非法,重複宣告same1
        }
    }

    function minimalScoping() public {
        {
            uint same2 = 0;
        }

        {
            uint same2 = 0;// 非法,重複宣告same2
        }
    }

    function forLoopScoping() public {
        for (uint same3 = 0; same3 < 1; same3++) {
        }

        for (uint same3 = 0; same3 < 1; same3++) {// 非法,重複宣告same3
        }
    }
}

除此之外,如果變數被宣告,則在函式的開頭將其初始化為其預設值。因此,以下程式碼是合法的,儘管寫得不好:

pragma solidity ^0.4.0;

contract C {
    function foo() public pure returns (uint) {
        // baz隱式初始化為0
        uint bar = 5;
        if (true) {
            bar += baz;
        } else {
            uint baz = 10;// 永遠不會執行
        }
        return bar;// 返回 5
    }
}


相關文章