上一篇了解了修飾詞在函式上的使用,這一篇就會來說說 Solidity 的基本控制結構的使用方式以及函式的基本用法。
一個基本有回傳值的函式長這樣:
function alert(string memory text) public pure returns (string memory) {
return text;
}
大家應該都不陌生吧!其實 Solidity 還可以回傳多個值喔!
回傳的資料可以是一個以上!
function show(string memory text) public pure returns (string memory, string memory) {
return ("Your message:", text);
}
可以讓函式之間互相呼叫(好像不是很稀奇的事情XD):
function test() public pure returns (string memory) {
return sayHello();
}
function sayHello() private pure returns (string memory) {
return "Hello";
}
與 JavaScript 的條件敘述差不多~
function test() public pure returns (string memory) {
uint num = 2;
if (num > 1) {
return "HelloWorld";
} else {
return "HAHA";
}
}
在 Solidity 中沒有 switch
可以使用,這需要注意一下!
function test4() public pure returns (uint) {
uint num = 20;
num = (num == 20)? 1 : 3;
return num;
}
有 for
、 while
與 do...while
可以使用。
function test() public pure returns (uint) {
uint num = 0;
for (uint i = 0; i < 10; i++) {
num++;
}
return num;
}
function test() public pure returns (uint) {
uint num = 0;
while(num < 10) {
num++;
}
return num;
}
function test() public pure returns (uint) {
uint num = 0;
do {
num++;
} while(num < 10);
return num;
}
在 Solidity 中,特別設置了攸關 Gas 的錯誤處理,共有三個:
這在前面篇章有出現過,經常用在 modifier
裡做驗證。 require
的用途就是進行條件判斷,如果條件不成立,會將剩餘的 Gas 歸還,並將合約狀態回復,也是最常使用到的錯誤處理方式。
概念有點類似下方的 JavaScript 範例,針對輸入值做驗證,不成立就return
來終止運行:
const example = (isFalse = false) => {
if (isFalse) {
return;
}
console.log('Hello'); //不會執行
}
require
範例,寫在修飾詞中,並判斷是否為合約部署者:
pragma solidity ^0.5.0;
constract Permission {
address private admin;
modifier onlyAdmin {
require(msg.sender == admin, "You don't have permission.");
_; //要加這個
}
constructor() {
admin = msg.sender;
}
}
跟 require
十分接近但沒有條件判斷,當呼叫時會歸還剩餘的 Gas 並回復合約狀態。
function test() public pure returns (string memory) {
uint num = 0;
if (num != 1) {
resvert("is false");
}
return "HelloWorld";
}
跟 require
一樣做判斷,但當條件不成立時,會將 Gas 全數消耗,不會返回任何的 Gas ,並回復合約狀態。通常用來處理較嚴重的錯誤,如:程式 bug ,為最不該被經常使用到的錯誤處理。
function test() public pure returns (string memory) {
uint num = 0;
assert(num != 1); //基本上不可能發生,除非程式錯誤
return "HelloWorld";
}
了解 Solidity 的函式基本用法、條件敘述、迴圈敘述以及錯誤處理,特別要注意的是沒有 switch
的用法,以及 require
、 revert
、 assert
的區別。
Solidity 中Require(), Assert(), Revert()的用法和區別