.
控制流

在本章中,我们将探讨Cairo中的控制流(if-else和循环)。控制流使你能够根据条件执行特定代码逻辑。

If-else

If-else表达式允许你根据特定条件执行代码逻辑:如果满足特定条件,则执行一段代码,否则将执行另一段代码。在以下示例中,如果x为0,则is_zero()函数返回true,否则返回false

// if-else 示例
#[external(v0)]
fn is_zero(self: @ContractState, x: u128) -> bool{
    // if-else
    if( x == 0_u128 ){
        true
    } else {
        false
    }
}

if表达式以if关键字开始,后跟要满足的条件。我们可以在if之后包含一个else块,指定条件不满足时要执行的逻辑。值得注意的是,你的条件必须始终为bool,否则编译器将报错。

else-if

你可以使用else-if表达式创建多个条件,这对于处理复杂逻辑非常有用。

// else-if 示例
#[external(v0)]
fn compare_256(self: @ContractState, x: u128) -> u8{
    // else-if
    if( x < 256_u128 ){
        0_u8
    } else if (x == 256_u128 ){
        1_u8
    } else {
        2_u8
    }
}

从if-else返回值

因为if-else是一个表达式,所以你可以将if-else表达式的结果分配给一个变量。这可以简化你的代码。

// 示例:从if-else返回值
#[external(v0)]
fn is_zero_let(self: @ContractState, x: u128) -> bool{
    // return value from if-else
    let isZero = if( x == 0_u128 ){
        true
    } else {
        false
    };
    return isZero;
}

循环

循环允许你在特定条件下反复执行代码。与其他具有多种循环类型(forwhile等)的编程语言不同,Cairo目前仅支持一种循环类型:loop

loop关键字将反复执行一段代码,直到见到break关键字才停止。

// 循环示例
#[external(v0)]
fn sum_until(self: @ContractState, x: u128) -> u128{
    let mut i: u128 = 1;
    let mut sum: u128 = 0;
    // loop
    loop {
        if (i > x) {
            break ();
        } 
        sum += i;
        i += 1;
    };
    return sum;
}

从循环返回值

你可以通过在break关键字后添加表达式从循环返回值。在下面的示例中,循环完成后,我们返回sum_i的值。

// 示例:从循环返回值
#[external(v0)]
fn sum_until_let(self: @ContractState, x: u128) -> u128{
    let mut i: u128 = 1;
    let mut sum_i: u128 = 0;
    // return value from loop
    let sum = loop {
        if (i > x) {
            break sum_i;
        } 
        sum_i += i;
        i += 1;
    };
    return sum;
}

总结

在本章中,我们介绍了Cairo中的基本控制流结构,包括if-else表达式和循环。