前言
看最近一段时间群友都在学rust,于是抽空看了一下rust官方文档的前两章,第二章的案例猜数字大小基本把前面几节的东西都复习了一遍,所以看完它的猜数字大小的游戏,我又掌握了哪些东西呢?
使用cargo为项目添加crate
cargo简单来说就是rust的项目管理工具,可以帮助你编译、运行项目和管理外部crate。这个crate,简单来说就是包,跟js的包,差不多一个概念。当然有趣的是,cargo的意思是货堆,而crate的意思是装货的木箱,非常形象:
在这个猜数字的游戏中,我们需要随机生成一个数字,这时候,我们需要使用到一个叫rand的crate,这时我们需要在Cargo.toml里面添加rand:
[package]
name = "gussing_game"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
rand = "0.8.3" #添加rand
说白了Cargo.toml就等于package.json,当然有了package.json,怎么能少了lock文件,所以跟package-lock.json功能相同的是Cargo.lock。添加完之后,运行cargo build,即可下载包:
当然我已经安装一遍过了,所以显示
从cache里拿。
一些常用命令
- 可以使用
cargo new创建一个项目- 使用
cargo build构建项目到target- 使用
cargo run来构建项目到target,并运行- 使用
cargo check来构建一个项目,但是不产生exe文件,并检查代码错误- 使用
cargo build --release去构建生产版本
控制台打印
控制台输出使用println!,当然可以像js的字符模板那样使用{}来占位:
fn main() {
let name = "1212";
println!("Hello, world!{name}");
}
输出:
当然也可以使用println!的第二个参数:
fn main() {
let name = "1212";
let hello = "hello";
println!("Hello, world!{}{}", name, hello);
}
输出:
变量的可变性
rust的声明变量使用let关键字。同时,rust的变量比较特殊,默认是immutable(不可变)。
fn main() {
let name = "1212";
name = "123123";
}
当然我们存储用户输入的变量,肯定是一个可变的变量,所以我们需要使用mut关键字去修饰这个变量,让变量成为mutable:
fn main() {
let mut name = "1212";
name = "123123";
}
变量的引用
&关键字用来引用变量的地址,因为我们要改变用来存储用户的输入变量,所以传入方法时,需要传递的是变量的指针。
io::stdin()
.read_line(&mut guess)
.expect("Failed to read line");
match控制符
这个关键字经常用到,用来处理错误和控制流程,还不是非常明白,只知道和enum搭配。
// 执行完成后,匹配返回的Result枚举类中的Ok或者Err
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
变量的覆盖
我们知道在js中在同一个函数环境内,使用let或const是不能声明两个相同名称的变量的,但是rust可以:
fn main() {
let mut name = "1212";
name = "123123";
let mut name = "1212";
}
check build之后,并没有报错:
字符串类型转换成数字类型
在这个游戏当中,用户输入之后,我们拿到的肯定是String类型的,但是我们需要转变为数字类型才行,
所以要使用parse去转换:
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
可以看到match无处不在。
流程控制语句loop
在这个游戏当中,猜错了,需要重新输入,并提示玩家,是猜大了·,还是猜小了,并且继续输入。如果猜对了,输出You win!并退出程序,这就要使用loop+break+continue来控制流程:
loop {
println!("Please input your guess.");
let secret_number = rand::thread_rng().gen_range(1..=100);
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; //退出
}
}
}
总结
总的来说,rust是一门非常棒的语言,值得去学习,未来也是其它语言作为前端工具链的时代。