Rust程式設計進階:074、never type介紹

語言: CN / TW / HK

例子:
Cargo.toml檔案內容:

[package]
name = "learn_htype2"
version = "0.1.0"
authors = ["anonymousGiga <[email protected]>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.6.0"

main.rs檔案內容:

//2、從不返回的never type
//Rust 有一個叫做 ! 的特殊型別。在型別理論術語中,它被稱為 empty type,因為它沒有值。
//我們更傾向於稱之為 never type。在函式不返回的時候充當返回值
//fn bar() -> ! {
//    loop{}
//}

//以下例子為《Rust程式設計語言》中第二章“猜猜看”遊戲的例子
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
    println!("Guess the number!");
    let secret_number = rand::thread_rng().gen_range(1, 101);
    loop {
        println!("Please input your guess.");
        let mut guess = String::new();
        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue, //continue 的值是 !。
                                //當 Rust 要計算 guess 的型別時,它檢視這兩個分支。
                                //前者是 u32 值,而後者是 ! 值。
                                //因為 ! 並沒有一個值,Rust 決定 guess 的型別是 u32
        };
        println!("You guessed: {}", guess);
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }
    }
}


//panic!
//Option<T> 上的 unwrap 函式程式碼:
//impl<T> Option<T> {
//    pub fn unwrap(self) -> T {
//        match self {
//            Some(val) => val,
//            None => panic!("called `Option::unwrap()` on a `None` value"),
//        }
//    }
//}

本節全部原始碼:
https://github.com/anonymousGiga/learn_rust/tree/master/learn_htype2