Rust 程式設計視訊教程(進階)——027_2 高階特性 2

linghuyichong發表於2020-02-22

頭條地址:https://www.ixigua.com/i677586170644791348...
B站地址:https://www.bilibili.com/video/av81202308/

github地址:https://github.com/anonymousGiga/learn_rus...

1、從不返回的never type
Rust 有一個叫做 ! 的特殊型別。在型別理論術語中,它被稱為 empty type,因為它沒有值。我們更傾向於稱之為 never type。在函式不返回的時候充當返回值:

fn bar() -> ! { 
    // --snip--
}

例子1:
//Cargo.toml檔案

[dependencies] rand = "0.6.0"

//src/main.rs

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; 
            } 
        } 
    } 
}

說明:never type 可以強轉為任何其他型別。允許 match 的分支以 continue 結束是因為 continue 並不真正返回一個值;相反它把控制權交回上層迴圈,所以在 Err 的情況,事實上並未對 guess 賦值。

例子2:panic!
Option 上的 unwrap 函式程式碼:

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

說明:
match 時,Rust 知道 val 是 T 型別,panic! 是 ! 型別,所以整個 match 表示式的結果是 T 型別。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

令狐一衝

相關文章