控制转移语句 (Control Transfer Statements)

控制转移语句允许程序非顺序地改变其执行流程,例如提前退出循环或函数。Flurry 提供了 break, continue, 和 return 三种主要的控制转移语句。

break

break 语句用于立即终止其所在的最内层循环(forwhile)的执行。程序控制流将跳转到该循环语句之后的下一条语句。

示例:

let numbers = [1, 5, -3, 8, 2];
let found_negative = false;

for num in numbers {
    if num < 0 {
        found_negative = true;
        break; -- 找到第一个负数,立即退出 for 循环
    }
    println("Checking positive number: {}", num);
}

if found_negative {
    println("Found a negative number.");
} else {
    println("All numbers are non-negative.");
}
-- 输出:
-- Checking positive number: 1
-- Checking positive number: 5
-- Found a negative number.

带标签的 break: 如果存在嵌套循环,可以使用标签来指定 break 要终止的是哪个循环。

for:outer i in 0..5 {
    for j in 0..5 {
        if i * j > 10 {
            println("Found i*j > 10 at i={}, j={}. Breaking outer loop.", i, j);
            break outer; -- 终止名为 'outer' 的循环
        }
    }
}

continue

continue 语句用于跳过当前循环迭代中剩余的代码,并立即开始下一次迭代。

  • while 循环中,控制流会跳转回循环条件的判断处。
  • for 循环中,控制流会跳转到下一次迭代(获取迭代器的下一个元素)。

示例:

for i in 0..5 {
    if i % 2 == 0 {
        continue; -- 如果 i 是偶数,跳过本次迭代的 println
    }
    println("Found odd number: {}", i);
}
-- 输出:
-- Found odd number: 1
-- Found odd number: 3

带标签的 continue: 与 break 类似,可以使用标签来指定 continue 要作用于哪个嵌套循环。

for:outer i in 0..3 {
    for j in 0..3 {
        if i == 1 {
            println("Skipping outer iteration for i=1");
            continue outer; -- 跳过外层循环 i=1 的剩余部分,直接开始 i=2
        }
        println("Processing i={}, j={}", i, j);
    }
}

return

return 语句用于从当前函数中退出,并可选地将一个值返回给函数的调用者。

语法:

return;             -- 从返回 void 的函数退出
return <value_expr>; -- 从返回特定类型的函数退出,并返回值
  • <value_expr>: 其类型必须与函数签名中声明的返回类型兼容。
  • 一旦执行 return 语句,函数立即终止,控制权交还给调用点。

示例:

fn check_age(age: u32) -> bool {
    if age < 18 {
        println("Too young.");
        return false; -- 提前返回 false
    }
    println("Age is sufficient.");
    return true; -- 返回 true
}

fn process() {
    println("Processing start.");
    if some_condition() {
        return; -- 提前退出 process 函数 (假设 process 返回 void)
    }
    println("Processing continued.");
    -- ...
    println("Processing end.");
}

returnif_guard: return 可以与条件守卫结合使用,形成简洁的提前返回模式。

fn get_user(id: Uuid) -> ?User {
    let data = database.fetch(id)?; -- 假设 ? 用于错误传播或 Option 解包
    return null if data.is_empty(); -- 如果数据为空,提前返回 null
    -- ... process non-empty data ...
    User.from(data)
}

总结: break, continue, 和 return 是控制程序非线性执行流程的基本工具。breakcontinue 主要用于控制循环,而 return 用于退出函数。标签的使用为嵌套结构提供了更精确的控制能力。