看一段代碼,在沒學過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的感受。