Rust 導引筆記系列 #09 -- 迴圈

迴圈是程式中不可或缺的一部分,在 Rust 中,迴圈就有三種。雖然大部分情況下是可以用不同種的迴圈去做到一樣的效果,但會影響寫程式的效率及程式碼的美觀。因此,這三種迴圈都有其適用的情況。

@_@ 終於把幾何造形的期末專題弄完了,寒假現在才正式開始了…

迴圈是程式中不可或缺的一部分,在 Rust 中,迴圈就有三種。雖然大部分情況下是可以用不同種的迴圈去做到一樣的效果,但會影響寫程式的效率及程式碼的美觀。因此,這三種迴圈都有其適用的情況。


無限迴圈 -- loop

fn main() {
    loop {
        doSomething();
    }
}

毫無反應,就是一個無限迴圈。除了用 break 之外,沒有辦法讓它跳離迴圈,最好確認一下有沒有適當的 break 條件。

在 Rust 中, loop 有一個特別之處,就是裡面所用的 break 是可以回傳值的

fn main() {
    let result = loop {
        let x = doSomething();
        if x > 100 {
           break x;
        }
    }; // <-- semicon here!
    println!("{}", result);
}

接在 let 的時候別忘了分號喔~ 反正忘了就只是編譯失敗而已


條件迴圈 -- while

fn main() {
    let mut x = 0;
    while x < 100 {
        println!("{}", x);
        x += 1;
    }
}

是熟悉的 while 迴圈呢,基本上除了和 if 一樣,條件表達式的外圍不需要加上小括號之外,用起來跟大部分的語言都一樣,就不多贅述了。


疊代迴圈 -- for

fn main() {
    let scores = vec![55, 30, 87, 94, 68];
    let mut max_score = 0;
    for s in scores {
        println!("{}", s);
        if s > max_score {
           max_score = s;
        }
    }
    println!("Your maximum score: {}", max_score);
}

疊代迴圈,顧名思義就是會將疊代器內的所有元素都跑過一次,所以只能在可以轉換為疊代器的型別上使用(像是 Vec , Array …)。

for 的後面是接疊代的元素, in 後面接的是可以疊代的容器

有人會問說要怎樣用 for 跑一個數字範圍,這時候就需要一個特殊的疊代器 Range ,用法如下

fn main() {
    for x in 0..100 {
        println!("{}", x);
    }
}

0..100 會創造一個 [0, 100) 的區間,它具有疊代器的特性,就可以給 for 用了,其他的一些用法:

  • 0..=100 : [0, 100] 的閉區間
  • (0..100).rev() : 倒著數回來 99, 98, 97, ...
  • (0..100).step_by(2) : 間隔2個數 0, 2, 4, 6, 8, ...

值得思考的小問題:

  • (0..100).rev().step_by(2) : ??
  • (0..100).step_by(2).rev() : ??

※註: .rev() 是由 Iterator::rev() 提供的, .step_by() 則是 Iterator::step_by()


迴圈標籤

Rust 支援迴圈標籤,可以直接 breakcontinue 到外層的迴圈

fn main() {
    'outer: for x in 0..10 {
        'inner: for y in 0..10 {
            if (x + y) > 10 {
                continue 'outer;
            }
            println!("({}, {})", x, y);
        }
    }
}

break 的用法亦同,就不解釋了


上一篇:#08 -- if 條件敘述

下一篇:#10 -- 結構

Rust 導引筆記系列目錄