歡迎來到 Rust 的世界!在編程中,我們經常需要重複執行某段代碼,這就是“循環”大顯身手的時候。Rust 提供了三種強大且各具特色的循環工具:loop, whilefor

本教程將帶你逐一瞭解它們,並通過生動的圖解和實例,讓你明白何時使用哪種循環。

循環概覽

在開始之前,我們先通過一張圖來快速瞭解這三種循環的“性格”和適用場景。


1. loop:永不停止的循環

loop 是 Rust 中最簡單、最直接的循環。它的任務是:創建一個無限循環,除非你明確告訴它要 break(跳出)。

語法

loop {
    // 這裏的代碼會永遠執行下去...
}

何時使用?

當你需要一個必須手動停止的循環時,loop 是最佳選擇。例如,服務器的主循環,它會持續等待並處理客户端的請求,直到服務器被關閉。

示例與圖解

想象一個不斷計數的機器,只有當我們喊“停!”的時候,它才會停下來。

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 3 {
            println!("三到了,準備跳出!");
            // 使用 break 跳出循環,並返回一個值
            break counter * 2; 
        }
        println!("當前計數: {}", counter);
    }; // 注意這裏的分號,因為 loop 是一個表達式

    println!("循環結束,返回的結果是: {}", result);
}

輸出:

當前計數: 1
當前計數: 2
三到了,準備跳出!
循環結束,返回的結果是: 6

loop 的工作流程圖

核心要點:

  • loop 是一個表達式,這意味着它可以返回一個值。
  • 你必須使用 break 關鍵字來終止循環,否則程序會永遠卡在這裏。
  • break 可以帶一個值,這個值就是整個 loop 表達式的返回值。

2. while:帶條件的循環

while 循環就像一個守門員。它會在每次循環開始前檢查一個條件。如果條件為 true,就執行循環體;如果為 false,就結束循環。

語法

while condition {
    // 當 condition 為 true 時,執行這裏的代碼
}

何時使用?

當你希望循環在某個條件不再滿足時自動停止while 就非常合適。最經典的例子就是倒計時。

示例與圖解

讓我們來寫一個從 5 數到 1 的倒計時程序。

fn main() {
    let mut number = 5;

    while number > 0 {
        println!("倒計時: {}", number);
        number -= 1;
    }

    println!("發射!🚀");
}

輸出:

倒計時: 5
倒計時: 4
倒計時: 3
倒計時: 2
倒計時: 1
發射!🚀

while 的工作流程圖

核心要點:

  • while 在每次迭代之前檢查條件。
  • 如果初始條件就是 false,循環體一次都不會執行。
  • 它非常適合處理不確定具體次數,但有明確終止條件的循環。

3. for:遍歷一切的循環

for 循環是 Rust 中最常用、也是最受歡迎的循環。它的設計初衷就是為了安全、簡潔地遍歷一個集合(如數組、向量、範圍等)中的每一個元素。

語法

for element in collection {
    // 對 collection 中的每個 element 執行這裏的代碼
}

何時使用?

當你需要遍歷一個數據集合中的所有元素時,請毫不猶豫地使用 for 循環。它比 while 循環更安全,可以避免常見的“差一錯誤”(off-by-one error)。

示例與圖解

示例 1:遍歷一個範圍

我們可以使用 a..b 語法來創建一個從 ab(但不包含 b)的範圍。

fn main() {
    // 遍歷從 1 到 4 的範圍
    for i in 1..5 {
        println!("i 的值是: {}", i);
    }
}

輸出:

i 的值是: 1
i 的值是: 2
i 的值是: 3
i 的值是: 4
示例 2:遍歷一個數組
fn main() {
    let fruits = ["蘋果", "香蕉", "橙子"];

    for fruit in fruits {
        println!("我喜歡吃: {}", fruit);
    }
}

輸出:

我喜歡吃: 蘋果
我喜歡吃: 香蕉
我喜歡吃: 橙子

for 的工作流程圖

核心要點:

  • for 循環通過迭代器工作,它安全地獲取集合中每個元素的引用,無需手動管理索引。
  • 它能自動處理循環的開始和結束,不會越界。
  • 在大多數需要遍歷的場景下,for 都是最佳選擇。

循環控制:breakcontinue

whilefor 循環中,你也可以使用 breakcontinue 來更精細地控制循環流程。

  • break:立即跳出整個循環。
  • continue:跳過當前迭代的剩餘代碼,直接開始下一次迭代。

示例:

fn main() {
    for i in 1..=5 { // 1..=5 表示包含 5
        if i == 3 {
            println!("跳過數字 3");
            continue; // 跳過本次循環,進入下一次
        }
        if i == 4 {
            println!("遇到數字 4,提前結束!");
            break; // 跳出整個循環
        }
        println!("當前數字: {}", i);
    }
    println!("循環結束。");
}

輸出:

當前數字: 1
當前數字: 2
跳過數字 3
遇到數字 4,提前結束!
循環結束。

總結與選擇

循環類型

主要用途

優點

缺點

loop

無限循環,需手動 break

簡單,可返回值

容易忘記 break 導致死循環

while

基於條件的循環

直觀,條件清晰

需要手動管理循環變量,容易出錯

for

遍歷集合/範圍

最安全,最簡潔,不易出錯

主要用於迭代,不適合複雜的條件判斷

如何選擇?

  • 需要無限循環?用 loop
  • 需要根據一個條件來循環,且不確定次數?用 while
  • 需要遍歷一個集合中的所有元素?永遠優先選擇 for