09_Cairo 中的流程控制#
此文章使用的 Cairo 編譯器版本:2.0.0-rc0。因為 Cairo 正在快速更新,所以不同版本的語法會有些許不同,未來將會將文章內容更新到穩定版本。
if 語句#
use debug::PrintTrait;
fn main() {
let number = 3;
if number == 3 {
'condition was true'.print();
}
}
使用起來很簡單,不需要用括號將條件括起來。
再來看看多個判斷條件的情況:
use debug::PrintTrait;
fn main() {
let number = 3;
if number == 12 {
'number is 12'.print();
} else if number == 3 {
'number is 3'.print();
} else if number - 2 == 1 {
'number minus 2 is 1'.print();
} else {
'number not found'.print();
}
}
多個判斷條件的執行順序是:從上往下依次執行,遇到滿足條件的,就會跳出不再進行下面的條件判斷。就像上面的,第二個條件 number == 3
已經滿足,第三個條件即使是 true ,也不會被執行。
特殊的 if 語句,實現與三目運算符相同的效果#
這個語句是將 let 語句和 if 語句連在一起使用。
use debug::PrintTrait;
fn main() {
let condition = true;
let number = if condition {5} else {6};
if number == 5 {
'condition was true'.print();
}
}
上述代碼中,如果 condition 為 true,那麼 number 就被創建為 5;如果 condition 為 false,那麼 number 就被創建為 6;
solidity 的三目運算符是這樣:
bool condition = true;
uint256 a = condition ? 5 : 6;
loop 循環語句#
loop 可以讓循環無限進行下去,控制循環可以使用continue
和 break
。先看看一個案例:
use debug::PrintTrait;
fn main() {
let mut i: usize = 0;
loop {
i += 1;
if i < 10 {
'again'.print();
continue;
}
if i == 10 {
break ();
};
}
}
以上代碼中,i 是自增的,小於 10 的時候會通過 continue 指令,直接進入下一次循環,continue 一下的邏輯不會執行;當 i 等於 10 的時候,就使用 break 指令跳出循環。
- break 後面需要添加返回值,沒有返回值就使用空值類型
()
,但是不可以省略。
注意⚠️:在執行帶有 loop 的 Cairo 代碼時,需要使用 --available-gas
選項指定 Gas 上限。如:
cairo-run --available-gas 200000 $CairoFile
獲取 loop 的返回值#
上面說到 break 必須要帶上返回值,我們可以獲取這個返回值:
use debug::PrintTrait;
fn main() {
let mut i: usize = 0;
let t = loop {
i += 1;
if i >= 10 {
break i;
};
};
t.print();
}
上面 t 最終的值是 10。
if 和 loop 的共性:獲取表達式的計算結果#
if 和 loop 都可以結合 let 來獲取 表達式的計算結果,也就是花括號內代碼的返回值。如上面提到的:
let number = if condition {5} else {6};
和
let t = loop {
i += 1;
if i >= 10 {
break i;
};
};
在 Cairo 中,通用的 獲取表達式的計算結果 的方式,可以直接獲取 {}
內代碼塊的返回值。
use debug::PrintTrait;
fn main() {
let y = {
let x = 3;
x + 1
};
y.print();
}
我們可以將 if 和 loop 和 let 結合的寫法可以理解為:他們都是基於通用的 獲取表達式的計算結果 的方式的語法糖。