Skip to content

控制流

控制流语句允许我们控制程序的执行流程。它们可以让我们根据条件执行不同的代码块,或者重复执行某些代码块。

条件语句

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 之间的偶数。

breakcontinue

breakcontinue 语句可以用于 whileloop 循环。

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 语言中非常重要的部分,它们可以让我们编写更复杂和灵活的程序。