Rust 學習筆記:一般程式概念(下)

October 1, 2023 · Chinese


前言

本系列文書寫我個人初探 Rust 的學習筆記,章節劃分主要基於著名的 The BookThe Rust Programming Language,程式碼部分通常是個人閱讀消化後以方便說明的方式撰寫,完整學習建議直接參見該書。

The Rust Programming Language

該書也有中文翻譯版,不過個人閱讀以英文原版為主以鞏固對 terminology 的一致認識,我認為對未來閱讀以及查找資料會較為順暢。

不論語言該書都是相當優秀的學習資源,選擇適合你的語言開始學習 Rust 吧。

Appendix F: Translations of the Book

流程控制

接續上篇,本篇進入流程控制,即條件判斷與迴圈。

條件判斷

Rust 中基本的條件判斷 if-else 寫法如下,condition 的部分並不加括號。

let x = 1;
    
if x == 0 {
    println!("x is 0.");
} else if x > 0 {
    println!("x is greater than 0.");
} else {
    println!("x is less than 0.");
}

利用 block scope 會回傳最後一行 expression 的特性,可以這樣用於賦值,得到結構上類似其他語言 ternary operation 的寫法。

let x = 1;
let y = if x == 0 { "equal" } else { "not equal" };
println!("{}", y);  // not equal

迴圈

Rust 提供三種迴圈的寫法。

loop

最基礎的 loop 迴圈,沒有終止條件,需要在內部使用 break 終止迴圈。以下程式只會執行一次後便停止。

loop {
    println!("again");
    break;
}

Rust 中的 loop 是可以回傳值的,在 break 後放上要回傳的值。

let mut counter = 0;
let five = loop {
    if counter == 5 {
        break counter;
    }
    counter += 1;
};
println!("{}", five);   // 5

Rust 中的 loop 是可以加上 label 的,提供跳出巢狀迴圈的可能,甚至可以用它做到一些類似 goto 的操作,不過個人不是很喜歡這種用法就不提了 XD。

while

while loop 就是附帶終止條件的迴圈,不過 Rust 是沒有 do-while loop 的,不過這也不是什麼問題很多語言都不會有,基本上用基本的迴圈就能達成。

let mut count = 0;

while count <= 5 {
    print!("{}", count);

    count += 1;
}

// 012345

for

Rust 提供 for loop,尤其在遍歷陣列 (或其他 iterable) 時非常實用。

// loop over array elements
let arr = [10, 20, 30, 40, 50];
for item in arr {
    println!("{item}");
}

// loop over string chars
let my_string = "hello world";
for char in my_string.chars() {
    println!("{char}");
}

// loop over a range
for number in (1..10) {
    println!("{number}");
}