StarknetAstro

StarknetAstro

09_Cairo中的流程控制

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 可以讓循環無限進行下去,控制循環可以使用continuebreak。先看看一個案例:

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 結合的寫法可以理解為:他們都是基於通用的 獲取表達式的計算結果 的方式的語法糖。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。