區塊鏈特輯——solidity語言基礎(三)

2023-01-11 06:00:34

Solidity語法基礎學習

五、對映型別:

對映型態

Mapping Type

對映鑰匙Key → 真實資料 Value

mapping(KeyType → ValueType) VariableName

·關鍵字:mapping

  ·宣告一個對映,後面需定義鑰匙(Key)與資料(Value)的型態

·KeyType

  ·只能使用「內建型態(int,uint,……)」、「bytes」、「string」,或者「contract」與「列舉enum型態」。

  ·不支援「使用者自定義」或「複雜」的型態,如「對映mapping」、「結構structs」或「陣列arry」

·ValueType

  ·可以是任何型態

  ·各種值的預設值:

    字串→預設值→空

    數位→預設值→0

    布林值→預設值→0/false

 

mapping的原理

·所有的value都會被初始化成「預設值」。

  ·原因是在以太坊的空間上,所有未初始化的空間,都是0,換言之就是每個型態被迪定義的「預設定」。

·Key並不會被存在mapping型態裡,因此使用者沒辦法從mapping中取得所有的Key

·那他是怎麼查詢的呢?

  ·keccak256(Key)→Value

·因此,mapping沒有辦法記錄長度、大小、在沒有key的情況下也不能列出所有的value

Example:學號與成績

·建立一份合約class

·建立一個對映,將學號對映到成績中:

  ·學號uint

  ·成績uint

·提供一個函數update來更新學生成績

  ·update(uint student_id,uint score)

·提供一個函數getScore來取得學生成績

  ·get(uint students_id) → uint score

程式碼範例:

 

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    mapping(uint => uint) Students;
    function update(uint id,uint score) public {
        Students[id] = score;
    }
    function set(uint id) public view returns(uint) {
        return Students[id];
    }
}

六、迴圈體:

控制結構

Control Structure

前言:在程式中會遇見同一件事情需要用很多次,需要重複很多次,這時不可能將程式碼複製很多次,就需用「控制結構」進行控制。

·關鍵詞:if

  ·當滿足「條件」的時候,則執行「{}內的程式碼」

·條件必須是個「布林值」

  ·也就是邏輯判斷,如:未滿十八歲、是否高於最低薪資、論文有無抄襲、參考資料有無正確參照等。

若「000」,則「XXX」,否則「ZZZ」

if(條件){/*做點事兒*/} else{/*做點兒別的事兒*/}

·關鍵字:if-else

  ·當滿足「條件」的時候,則執行「{}內的程式碼」

  ·若不滿足「條件」則執行「else{}內的程式碼」

 

很多條件的情況

if(條件A){} else if (條件B){}……

·關鍵字:if-(else-if)*-else

·當有多個條件時,可以排序多個條件,else不一定要有

Example:成績計算(if)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    //宣告一個列表然後將值賦予列表
    uint[] Scores = [90,91,92,93,94];
    //定義一個函數X,這個函數公開可見可讀可寫,作用是返回一個無符號整數,輸出元素計算總和,同時index自加一直到預設條件
    function X() public view returns(uint) {
        //這裡將Sum預設值歸零
        uint Sum = 0;
        //這裡將index預設值歸零
        uint index = 0;
        //這裡開始while迴圈體
        while (index < 5) {
            //這裡是Sum將Score中的每一個元素輸出並相加
            Sum = Sum + Scores[index];
            //index自加確保在列表元素輸出完後,能夠跳出迴圈
            index++;
        }
        //最終返回總和
        return Sum;
    }
}

 

重複做事 for

for (宣告;條件;事後修改的事) {/*做點事兒*/}

·關鍵字:for(  ;  ;  ){}

  ·在滿足條件下,重複執行{}內的程式碼。

·宣告:

  ·迴圈事實上就是計數器,因此宣告是為了幫助我們製造出計數器的變數,計數器不一定是整數,只要能被利用在「條件判斷中」的型態都可以使用。

  ·要遍歷陣列的所有元素:for (uint index;  ;  )  {……}

·條件:同if

·事後修改的事:比如說增加計數器等修改的行為。

·若「條件」沒寫,則為一個「無限迴圈」是停不下來的。 

Example:統計學生成績(for)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    uint[] Score = [90,91,92,93,94];
    function X() public view returns(uint) {
        //宣告一個Sum變數,將其預設值歸零
        uint Sum = 0;
        //這裡for迴圈結構是(宣告;條件;事後修改的值){執行程式碼}
        //事實上這裡宣告就是宣告一個可以結束迴圈體的迴圈控制值
        for ( uint index = 0;index < 5;index++ ) {
            Sum = Sum + Score[index];
        }
        return Sum;
    }
}

 

重複做事 while

·關鍵字:while( ) { }

·在特定條件下,重複執行{ }內的程式碼。

·條件:同if

·若「條件」沒寫,則為一個「無限迴圈」是停不下來的。

Example:統計成績(while)

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Class {
    uint[] Score = [90,91,92,93,94];
    function X() public view returns(uint) {
        //宣告一個Sum變數,將其預設值歸零
        uint Sum = 0;
        //這裡for迴圈結構是(宣告;條件;事後修改的值){執行程式碼}
        //事實上這裡宣告就是宣告一個可以結束迴圈體的迴圈控制值
        for ( uint index = 0;index < 5;index++ ) {
            Sum = Sum + Score[index];
        }
        return Sum;
    }
}

離開當前迴圈 break

break

·關鍵字:break

  · 跳出當前迴圈

·若巢狀狀態,如for( ){for( ){for( ){ } } },就需要三個break。

 

跳出本次迴圈 continue

continue

·關鍵字:continue;

  ·跳過本次迴圈

    ·在「for」時,跳過以後會執行「事後修改的事」;

    ·在「while」時,就會跳回條件判斷

  ·當執行到continue的時候,會無條件跳過continue後的程式碼。