控制流
控制流语句允许我们控制程序的执行流程。它们可以让我们根据条件执行不同的代码块,或者重复执行某些代码块。
条件语句
if
表达式
if
表达式用于根据条件执行不同的代码块。它的语法如下:
move
if (<布尔表达式>) <表达式>;
if (<布尔表达式>) <表达式> else <表达式>;
<布尔表达式>
是一个返回布尔值的表达式。<表达式>
是一个代码块或单个表达式。
示例:
move
#[test]
fun test_if() {
let x = 5;
// `x > 0` 是一个布尔表达式。
if (x > 0) {
std::debug::print(&b"X 大于 0".to_string())
};
}
else
关键字
else
关键字是可选的,但如果需要在条件不满足时执行不同的代码块,就需要使用它。
示例:
move
#[test]
fun test_if_else() {
let x = 5;
let y = if (x > 0) { 1 } else { 0 };
assert!(y == 1);
}
- 在这个例子中,我们将
if
表达式的值赋给变量y
。如果x
大于 0,则y
将被赋值为 1,否则为 0。 else
块是必需的,因为两个分支必须返回相同类型的值。如果我们省略else
块,编译器会抛出一个错误。
循环语句
loop
循环
loop
循环会无限期地重复执行一个代码块,直到遇到 break
语句。它的语法如下:
move
loop {
<表达式>;
};
示例:
move
#[test]
fun test_break_loop() {
let mut x = 0;
// 循环执行,直到 `x` 等于 5。
loop {
x = x + 1;
// 如果 `x` 等于 5,则退出循环。
if (x == 5) {
break // 退出循环
}
};
assert!(x == 5);
}
break
语句用于在满足特定条件时退出循环。如果我们删除break
语句,循环将永远运行。
while
循环
while
循环会在条件满足的情况下重复执行一个代码块。它的语法如下:
move
while (<布尔表达式>) {
<表达式>;
};
示例:
move
// 这个函数迭代变量 `x` 直到它达到 10,返回值是达到 10 所需的迭代次数。
// 如果 `x` 为 0,则函数将返回 10。
// 如果 `x` 为 5,则函数将返回 5。
fun while_loop(mut x: u8): u8 {
let mut y = 0;
// 循环执行,直到 `x` 等于 10。
// 如果 `x` 大于等于 10,则循环永远不会运行。
while (x < 10) {
y = y + 1;
x = x + 1;
};
y
}
#[test]
fun test_while() {
assert!(while_loop(0) == 10); // 10 次
assert!(while_loop(5) == 5); // 5 次
assert!(while_loop(10) == 0); // 循环从未执行
}
continue
语句
continue
语句用于跳过当前循环迭代的剩余部分,并开始下一次迭代。它的语法如下:
move
continue
示例:
move
#[test]
fun test_continue_loop() {
let mut x = 0;
// 循环执行,直到 `x` 等于 10。
loop {
x = x + 1;
// 如果 `x` 是奇数,则跳过本次迭代的剩余部分。
if (x % 2 == 1) {
continue // 跳过本次迭代的剩余部分。
};
std::debug::print(&x);
// 如果 `x` 等于 10,则退出循环。
if (x == 10) {
break // 退出循环
}
};
assert!(x == 10); // 10
}
- 上面的例子中,循环会跳过奇数,只打印 0 到 10 之间的偶数。
break
和 continue
break
和 continue
语句可以用于 while
和 loop
循环。
return
语句
return
语句用于提前退出函数并返回一个值。它的语法如下:
move
return <表达式>
示例:
move
/// 如果 `x` 大于 0 且不等于 5,则此函数返回 `true`,否则返回 `false`。
fun is_positive(x: u8): bool {
if (x == 5) {
return false
};
if (x > 0) {
return true
};
false
}
#[test]
fun test_return() {
assert!(is_positive(5) == false);
assert!(is_positive(0) == false);
assert!(is_positive(1) == true);
}
总结
if
表达式用于根据条件执行不同的代码块。loop
循环会无限期地重复执行一个代码块,直到遇到break
语句。while
循环会在条件满足的情况下重复执行一个代码块。continue
语句用于跳过当前循环迭代的剩余部分,并开始下一次迭代。return
语句用于提前退出函数并返回一个值。
控制流语句是 Move 语言中非常重要的部分,它们可以让我们编写更复杂和灵活的程序。