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 结合的写法可以理解为:他们都是基于通用的 获取表达式的计算结果 的方式的语法糖。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。