Rust Guessing Game
簡介
rust官方示例,猜猜看遊戲 guessing_game 的小程序。從中我們可以感性認識到:
extern crates
外部包裝箱use crates
標準包裝箱 和 包裝箱fn func()
,.method()
函數,方法,關聯函數let
,mut
,:u32
等用於綁定的關鍵字loop
循環enum
枚舉match
條件判斷expect()
異常處理{}
在println中使用的佔位符- 以及一些有趣的
method
方法和關聯函數
包裝箱crates
類似其他語言中的庫library
或者包package
綁定bindings
類似其他語言中的變量variable
閱讀源碼之前
如果你未了解如何使用Cargo構建和運行你的程序,或者不知道如何依賴外部包裝箱。
請參閱下面的文章:rust cargo使用
源碼
做了些註釋便於閱讀,如有不當之處,請耐心指出,謝謝!
extern crate rand; // 類似於use rand; (需在Cargo.toml中添加此外部依賴)
use std::io; // 使用std庫的io庫, 類似於namespace
use std::cmp::Ordering;
use rand::Rng; // rand的位置 稱爲 特性traits域
fn main() // 輸入是空元組
{
println!("Guess the number!");
/* gen_range() 包含下限但不包含上限 */
let secret_number = rand::thread_rng().gen_range(1, 101);
// println!("The secret number is: {}", secret_number);
loop
{
println!("Please input your number:");
/*
let 創建新'綁定' '綁定'在其他語言中稱爲'變量 variable'
'綁定'默認是不可變的'immutable' 在c中稱爲'const'的
mut 讓'綁定'可變。'mutable'
----
let foo = bar; // immutable
let mut foo = bar; // mutable
*/
/*
String 字符串type,由std庫提供 String是可增長的,UTF-8文本
:: 是type的“關聯函數” 即::new()和String關聯,而非String的實例.
一些語言管這叫一個“靜態方法”
(而 . 是實例的方法)
new() 函數,創建一個空的type。 很多其他type上都能找到 new() 函數
*/
let mut guess = String::new();
/*
io::stdin() 如果文件開頭不寫 use std::io,
則這裏需要寫std::io::stdin(),
stdin() 返回一個指向終端標準輸入的句柄
read_line() stdin()的方法,一個type的特定實例(這裏的實例是stdin())上可用
( :: 是類型的關聯函數)
&mut guess &爲引用,引用默認是不可變的'immutable'。
而read_line()只接收&mut String類型
.expect("Failed to read line");
read_line()的返回值 io::Result,有個expect()的方法
*/
io::stdin().read_line(&mut guess).expect("Fail to readline");
/*
let guess: u32 Rust 允許我們用新值 遮蓋shadow 之前的變量
Shadowing 讓我們重用 guess 名字,而不是強迫我們想出兩個獨特名字
guess.trim().parse()
trim() method, 會去掉字符串開頭和結尾的任何空格
parse() method, 將字符串解析爲'一些類型'的數字
而這個 一些類型 由之前 let guess: u32,而被認爲是u32類型
parse() 返回值有Ok和Err兩種enum
*/
// let guess: u32 = guess.trim().parse().expect("Please type a number!");
let guess: u32 =
match guess.trim().parse()
{
Ok(num) => num,
Err(_) => continue,
};
/*
{} 佔位符
*/
println!("your guessd: {}", guess);
/*
cmp() 可以在任何能被比較的值上調用,並且它獲取你想要比較的值的引用
cmp() 返回一個 Ordering 類型
Ordering 是一個 枚舉enum,類似於:
enum Ordering
{
Less,
Greater,
Equal,
};
用 :: 來表明一個特定 enum 變量的命名空間
*/
match guess.cmp(&secret_number)
{
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {println!("You win!"); break;}
}//match
}// loop
}//end of main()