迴圈(Loop)#

Rust 提供三種迴圈:loopwhilefor,各有適合的使用場景。


1. loop#

loop無限循環 ,直到遇到 break 才停止:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn main() {
    let mut count = 0;

    loop {
        count += 1;
        if count == 3 {
            break;
        }
        println!("count = {count}");
    }
}

輸出:

count = 1
count = 2

2. loop 回傳值#

loop 是表達式,可以透過 break 回傳值:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2; // 回傳 20
        }
    };

    println!("result = {result}"); // result = 20
}

3. 迴圈標籤(Loop Label)#

在巢狀迴圈中,breakcontinue 預設作用在最內層。 使用 標籤(label) 可以指定要操作哪一層迴圈:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fn main() {
    'outer: loop {
        println!("進入外層迴圈");
        loop {
            println!("進入內層迴圈");
            break 'outer; // 直接跳出外層迴圈
        }
    }
    println!("結束");
}

4. while#

while 在條件為 true 時持續執行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fn main() {
    let mut n = 3;

    while n > 0 {
        println!("{n}!");
        n -= 1;
    }

    println!("發射!");
}

5. for 與範圍(Range)#

for 搭配範圍是 Rust 中最常見的迴圈寫法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fn main() {
    // 1..5 不含 5
    for i in 1..5 {
        println!("{i}");
    }

    // 1..=5 含 5
    for i in 1..=5 {
        println!("{i}");
    }
}

6. for 迭代集合#

for 可以直接迭代陣列或向量:

1
2
3
4
5
6
7
fn main() {
    let fruits = ["蘋果", "香蕉", "橘子"];

    for fruit in fruits {
        println!("{fruit}");
    }
}

7. for 搭配 enumerate#

使用 .enumerate() 同時取得索引和值:

1
2
3
4
5
6
7
fn main() {
    let langs = ["Rust", "Python", "Kotlin"];

    for (i, lang) in langs.iter().enumerate() {
        println!("{i}: {lang}");
    }
}

輸出:

0: Rust
1: Python
2: Kotlin

8. continue#

continue 跳過當次迭代,繼續下一次:

1
2
3
4
5
6
7
8
fn main() {
    for i in 1..=10 {
        if i % 2 == 0 {
            continue; // 跳過偶數
        }
        println!("{i}");
    }
}

Reference#

https://doc.rust-lang.org/book/ch03-05-control-flow.html