歡迎來到 Rust 的世界!在編程中,我們經常需要重複執行某段代碼,這就是“循環”大顯身手的時候。Rust 提供了三種強大且各具特色的循環工具:loop, while 和 for。
本教程將帶你逐一瞭解它們,並通過生動的圖解和實例,讓你明白何時使用哪種循環。
循環概覽
在開始之前,我們先通過一張圖來快速瞭解這三種循環的“性格”和適用場景。
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 語法來創建一個從 a 到 b(但不包含 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都是最佳選擇。
循環控制:break 和 continue
在 while 和 for 循環中,你也可以使用 break 和 continue 來更精細地控制循環流程。
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。 - 需要根據一個條件來循環,且不確定次數?用
while。 - 需要遍歷一個集合中的所有元素?永遠優先選擇
for。