这是一个用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,101);
//println!("The secret number is:{}",secret_number);
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,
};
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;
}
}
}
}
先讲讲我对着一段代码的认识:
-
一开始使用use指令引用一些库:
-
首先引入的
std::io
库提供很多有用的功能,包括接收用户输入的功能。 -
引入的rand::Rng库提供了随机数
- 从标准库引入了一个叫做
std::cmp::Ordering
的类型。同Result
一样,Ordering
也是一个枚举,不过它的成员是Less
、Greater
和Equal
。这是比较两个值时可能出现的三种结果。
-
println()打印函数,但是pintln!()则是一个宏
-
let secret_number = rand::thread_rng().gen_range(1,101);//首先用let指令创建一个不可变变量secret_number,引入库中随机函数gen_range()。且函数参数【1,101),半闭半开。本且赋值给secet_number。
-
let mut guess 表示创建一个可变变量guess
-
io::stdin().read_line(&mut guess).expect("Failed to read line");表示输入一个值赋给guess,expect()函数表示,如果出现前面程序错误会输入一句failed to read line 然后退出程序。
-
parse
返回一个Result
类型,而Result
是一个拥有Ok
或Err
成员的枚举。 -
让我们看看使用
match
表达式的例子。假设用户猜了 50,这时随机生成的秘密数字是 38。比较 50 与 38 时,因为 50 比 38 要大,cmp
方法会返回Ordering::Greater
。Ordering::Greater
是match
表达式得到的值。它检查第一个分支的模式,Ordering::Less
与Ordering::Greater
并不匹配,所以它忽略了这个分支的代码并来到下一个分支。下一个分支的模式是Ordering::Greater
,正确 匹配!这个分支关联的代码被执行,在屏幕打印出Too big!
。match
表达式就此终止,因为该场景下没有检查最后一个分支的必要。