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後的程式碼。