Rust 導引筆記系列 #08 -- if 條件

if 判斷式

雖然說在前面應該有見過不少次了,但還是要正式介紹一下。

Rust 的 if 判斷式大致上長這樣:

if a > 20 {
    do_something();
} else {
    do_otherthing();
}

整體上,看起來和目前主流的大多數語言都是一樣的語法。不過還是有許多地方是不同的,最明顯之處莫過於 if 之後的條件判斷是不需要加括號的,而且編譯器也會建議你拿掉它。

至於另一個不同之處也是我喜歡 Rust 的原因之一。

陳述式與表達式 (Statement & Expression)

一般在程式語言中,語句會分為兩類:陳述式與表達式,兩者的概念大概是這樣:

  • 陳述式:代表去執行一件工作,不會具有回傳值。在 C/C++/Java 等語言中,分號就是一個陳述式的結尾。
  • 表達式:程式中的一部分往往可以計算出一個值,像是 a < b1008 + 5 等等,被稱為表達式。

Rust 和大多數語言的其中一點不同是,它是一個以表達式為主的語言,絕大多數的語句都是一個表達式,而表達式更可以由

陳述式
陳述式
陳述式
...
表達式

所組成,最後面只能存在一個表達式,若沒有表達式的話,就會視為回傳了一個單元 (Unit) () 哦!

基本上,在 Rust 中,兩者最簡單的區分方式就是看有沒有分號啦~

作為表達式的 if

說了那麼多, if 要如何作為表達式呢?以下就用一個判斷成績等第的範例展示一下吧~

use std::io::stdin;

fn main() {
	print!("Enter your grade: ");
    let mut linebuf = String::new();
    stdin()
        .read_line(&mut linebuf)
        .expect("Failed to read from stdin");
    let score: i32 = linebuf
        .split_whitespace()
        .filter_map(|s| s.parse::<i32>().ok())
        .next()
        .unwrap();
    let grade_char = if score >= 90 {
        println!("Nice Job!!!"); // <-- Statement
        'A' // <-- Expression
    } else if score >= 80 {
        'B'
    } else if score >= 70 {
        'C'
    } else if score >= 60 {
        'D'
    } else {
        println!("Oh, no!");
        'F'
    }; // Don't forget to put a semicolon here!!!
       // Since it's a part of the `let` statement.
    
    println!("Your grade is {}.", grade_char);
}

整個 if 變成了一個表達式,每個條件的大括弧都是一個表達式,在裡面的字元也是一個表達式。最後再回傳並賦值給 grade_char 變數。值得注意的是,在這種用法之下,一定要有 else 的部份,才能保證所有路徑都有回傳值。

這種用法其實就像 (a > b ? a : b) ,但相較之下更加直觀與美觀,也因此 Rust 並沒有 ? : 這個三元條件運算子。


這次因為期中考的關係斷更了一個月,還請多多見諒…

上一篇:#07 -- 借用與參照

下一篇:#09 -- 迴圈

Rust 導引筆記系列目錄