注意:本教程面向于有语言基础的人员,重点对一些陌生概念和一些差距大的语法进行解释。
本篇将以一个猜数字游戏来带你快速入门Rust。
先看注释,后看补充!
use std::io::{self, Write};
use rand::Rng; // Rng是一个trait: 用于定义共享的行为集合(类似于接口)
use std::cmp::Ordering; // Ordering是一个枚举
fn main() {
let secret_number = rand::thread_rng().gen_range(1..101); // 1..101代表一个范围
println!("【猜数字】猜猜看我心里想的是哪个数字?答案:{}", secret_number);
loop {
print!("【猜数字】请猜一个数字:");
// 刷新输出缓冲区,否则print!不会立即输出
io::stdout().flush().expect("无法刷新输出缓冲区");
// mut:关键字,标记变量为可变; String::new():创建String对象
let mut guess = String::new();
// 读取用户输入 -> 赋值给guess(这里加&mut是可变引用的意思)
io::stdin().read_line(&mut guess).expect("无法读取行");
// 对guess类型进行转换,从 String -> u32(Shadowing机制)
let guess:u32 = match guess.trim().parse(){
Ok(num) => num,
Err(_) => continue,
};
// guess和secret_number进行比较,返回一个Ordering枚举类型{Less, Greater, Equal}
match guess.cmp(&secret_number) {
Ordering::Less => println!("【猜数字】太小了!"),
Ordering::Greater => println!("【猜数字】太大了!"),
Ordering::Equal => println!("【猜数字】恭喜你猜对了!"),
}
}
}
补充:
-
1..101这种写法为Rust的范围表达式写法,这里表示半开区间(包含1,不包含101),其他写法:1..=101(闭区间)、..101(从负无穷到101)、101..(从101到正无穷) -
Rust为了提高性能减少IO操作频率,拥有IO缓冲机制。只有在缓冲区刷新时(换行、程序结束、调用flush)才会进行IO操作。这也是为什么
print!不能立即输出的原因,需要使用flush()强制刷新缓冲区 -
Rust拥有Shadowing机制,即允许使用新变量隐藏旧变量,通常用于需要对旧变量进行处理的场景 。这样子不用修改变量名,并且避免使用mut来修改变量,可以使得代码更加清晰
-
这里
read_line方法返回了一个io::Result<usize>类型,是一个泛型枚举类型:{Ok,Err},用于错误处理。如果返回了Result则必须要进行处理,这里用了expect方法进行处理(很严格,这也是为什么Rust比较安全)。 -
Rust用
match替代了switch,它比swtich更加强大,可以匹配 常量、变量、范围、复合类型(元组、数组)、结构体、枚举。 用match可以进行更加详细的错误处理,因为Result就是一个枚举类型{Ok,Err}。