跳到主要内容

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-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表达式和循环。