Skip to content

Latest commit

 

History

History
154 lines (123 loc) · 3.94 KB

readme.md

File metadata and controls

154 lines (123 loc) · 3.94 KB
title tags
11. 控制流
cairo
starknet
flow
if-else
loop

WTF Cairo极简教程: 11. 控制流

我最近在学cairo-lang,巩固一下细节,也写一个WTF Cairo极简教程,供小白们使用。教程基于cairo 2.2.0版本。

推特:@0xAA_Science@WTFAcademy_

WTF Academy 社群:Discord微信群官网 wtf.academy

所有代码和教程开源在 github: github.com/WTFAcademy/WTF-Cairo


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

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类型,不能为0或1,否则编译器将报错。

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
    }
}

在let语句中使用if

因为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有两种循环:loopwhile

loop

loop关键字将反复执行一段代码,直到见到break关键字或者gas用尽才停止。此外,你也可以使用continue关键字来跳转到下一次循环

// 循环示例
#[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 ();
        }
        if (i % 5 == 0) {
            i += 1;
            continue;
        }
        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;
}

while

while关键字会重复执行该段代码,直到条件不满足或gas用尽跳出循环。

#[external(v0)]
fn sum_while(self: @ContractState, x: u128) -> u128{
    let mut i: u128 = x;
    let mut sum: u128 = 0;
    // while
    while (i != 0) {
        sum += i;
        i -= 1;
    };
    return sum;
}

总结

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