1.前端學習Rust第一個里程碑,完成猜數遊戲

看一段代碼,在沒學過rust前提下,嘗試理解下。

use std::io;
use rand::Rng;
use std::cmp::Ordering;
fn main() {
    println!("Guess the number!");
    let secret_number = rand::thread_rng().gen_range(1..=100);
    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
        };
    
        match guess.cmp(&secret_number){
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal=>{
                println!("You win");
                break;
            }
        }
    }
    
}

let secret_number = rand::thread_rng().gen_range(1..=100);,這個是生成一個1到100之間的數,其中rand需要安裝,起初下載速度很慢,就在我搜索解決辦法時候,下載完了。

包管理這塊跟前端挺像的。只是這個命名方式,::應該是調用靜態方法,1..=100這個怎麼看也不如1,100這種直觀。

loop 表現循環,let mut guess = String::new();, 單獨用let聲明的不可變,加上mut纔可變。rust有類型推導,String::new()這種就知道是字符串了,不需要在變量上聲明。

io::stdin().read_line ,可以讓用戶在命令行輸入內容,它會返回一個Result類型,.expect("Failed to read line");就是用來處理。其實這裏沒有體現出價值,出問題也是退出執行,出問題也是系統問題,感覺不退出也沒什麼好做的。不加程序能運行,但會有警告。

&表示這是一個參數的引用,它允許多處代碼訪問同一數據,

let guess:u32 是rust本身支持的,用來避免類型轉換導致的變量聲明,但是前面這個let還是會讓我覺得是聲明瞭一個新變量,加個標識符表明這種行爲豈不是更好。match 是用來處理枚舉的,類似於條件語句,.trim().parse就是轉換爲數字,因爲前面有:u32,所以這裏就是轉換爲數字,這個挺好的。後面的花括號就是處理parse返回的枚舉,ok就原值返回,Err就是觸發continue,防止退出程序。 _是一個通配符,用來匹配所有 Err 值,不管其中有何種信息。

guess.cmp(&secret_number) 就是比較兩個值的大小,前面的match用來配合後面的花括號區域處理不同結果,Ordering::Less 小於。Ordering::Greater大於。Ordering::Equal等於,然後break退出。

match處理更有整體感,功能分割的很好,但是導入語句以及枚舉類型的複雜度,也增加了不少心智負擔。 loop這種確實簡練很多,以上就是我學了一陣Rust的感受。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章