·關鍵字:mapping
·宣告一個對映,後面需定義鑰匙(Key)與資料(Value)的型態
·KeyType
·只能使用「內建型態(int,uint,……)」、「bytes」、「string」,或者「contract」與「列舉enum型態」。
·不支援「使用者自定義」或「複雜」的型態,如「對映mapping」、「結構structs」或「陣列arry」
·ValueType
·可以是任何型態
·各種值的預設值:
字串→預設值→空
數位→預設值→0
布林值→預設值→0/false
·所有的value都會被初始化成「預設值」。
·原因是在以太坊的空間上,所有未初始化的空間,都是0,換言之就是每個型態被迪定義的「預設定」。
·Key並不會被存在mapping型態裡,因此使用者沒辦法從mapping中取得所有的Key
·那他是怎麼查詢的呢?
·keccak256(Key)→Value
·因此,mapping沒有辦法記錄長度、大小、在沒有key的情況下也不能列出所有的value
·建立一份合約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];
}
}
前言:在程式中會遇見同一件事情需要用很多次,需要重複很多次,這時不可能將程式碼複製很多次,就需用「控制結構」進行控制。
·關鍵詞:if
·當滿足「條件」的時候,則執行「{}內的程式碼」
·條件必須是個「布林值」
·也就是邏輯判斷,如:未滿十八歲、是否高於最低薪資、論文有無抄襲、參考資料有無正確參照等。
·關鍵字:if-else
·當滿足「條件」的時候,則執行「{}內的程式碼」
·若不滿足「條件」則執行「else{}內的程式碼」
·關鍵字:if-(else-if)*-else
·當有多個條件時,可以排序多個條件,else不一定要有
//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 (uint index; ; ) {……}
·條件:同if
·事後修改的事:比如說增加計數器等修改的行為。
·若「條件」沒寫,則為一個「無限迴圈」是停不下來的。
//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( ) { }
·在特定條件下,重複執行{ }內的程式碼。
·條件:同if
·若「條件」沒寫,則為一個「無限迴圈」是停不下來的。
//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
· 跳出當前迴圈
·若巢狀狀態,如for( ){for( ){for( ){ } } },就需要三個break。
·關鍵字:continue;
·跳過本次迴圈
·在「for」時,跳過以後會執行「事後修改的事」;
·在「while」時,就會跳回條件判斷
·當執行到continue的時候,會無條件跳過continue後的程式碼。