在 Move 中,我們可以使用 while、loop、if 表達式來控制運行代碼
if 表達式,允許在某些條件為 true 時運行特定代碼,反之亦然。
特別注意,只要是表達式就必須以分號結尾,可以返回一個值。
script {
use 0x1::Debug;
fun main() {
let a = true;
if (a) {
// do A
} else {
// do B
}; // 需加上分號
}
}
while 表達式,是一種定義循環的方法,在某些條件為 true 時執行。
需要加上分號,不能返回一個值。
script {
fun main() {
let i = 0; // define counter
// iterate while i < 5
// on every iteration increase i
// when i is 5, condition fails and loop exits
while (i < 5) {
i = i + 1;
};
}
}
當無限 loop 發生時,大多數情況下,編譯器無法阻止發布,代碼的執行將持續消耗所有給定的資源 (所謂的區塊鏈術語 - gas)。
因此,需要多加小心撰寫的程式碼,或是使用更安全的 while
script {
fun main() {
let i = 0;
loop {
i = i + 1;
}
let _ = i;
}
}
執行上面這段程式,會出現此 ErrorExecution failed because of an out of gas error in script at code offset 11
continue: 分別跳過一輪
break: 中斷迭代
script {
fun main() {
let i = 0;
loop {
i = i + 1;
if (i / 2 == 0) continue; // 如果是偶數,跳過此輪
if (i == 5) break; // 如果等於 5,中斷 loop 迴圈
// do something here
};
0x1::Debug::print<u8>(&i); // debug: 5
}
}
需要自行終止事務的執行,可以使用關鍵字 abort
,允許後面的程式碼終止執行。
script {
fun main(a: u8) {
if (a != 10) {
abort 0;
}
// code here won't be executed if a != 10
// transaction aborted
}
}
使用關鍵字 assert 來宣告包含 abort + 條件,當不滿足條件時,將終止執行,反之不會執行任何操作。
assert!(<bool expression>, <code>)
script {
fun main(a: u8) {
assert!(a == 10, 0);
// code here will be executed if (a == 10)
}
}
使用控制流程時,需小心是否寫出無限 loop,讓我們 Move to Day8