看完rust的猜数字大小游戏,我掌握了哪些东西

151 阅读4分钟

前言

看最近一段时间群友都在学rust,于是抽空看了一下rust官方文档的前两章第二章案例猜数字大小基本把前面几节的东西都复习了一遍,所以看完它的猜数字大小的游戏,我又掌握了哪些东西呢? image.png

使用cargo为项目添加crate

cargo简单来说就是rust的项目管理工具,可以帮助你编译运行项目和管理外部crate。这个crate,简单来说就是,跟js,差不多一个概念。当然有趣的是,cargo的意思是货堆,而crate的意思是装货木箱,非常形象:

image.png

在这个猜数字的游戏中,我们需要随机生成一个数字,这时候,我们需要使用到一个叫randcrate,这时我们需要在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,即可下载包

image.png 当然我已经安装一遍过了,所以显示从cache里拿。

一些常用命令

  1. 可以使用cargo new创建一个项目
  2. 使用cargo build构建项目到target
  3. 使用cargo run来构建项目到target,并运行
  4. 使用cargo check来构建一个项目,但是不产生exe文件,并检查代码错误
  5. 使用cargo build --release去构建生产版本

控制台打印

控制台输出使用println!,当然可以像js字符模板那样使用{}来占位:

fn main() {
    let name = "1212";
    println!("Hello, world!{name}");
}

输出:

image.png

当然也可以使用println!的第二个参数:

fn main() {
    let name = "1212";
    let hello = "hello";
    println!("Hello, world!{}{}", name, hello);
}

输出:

image.png

变量的可变性

rust的声明变量使用let关键字。同时,rust的变量比较特殊,默认是immutable(不可变)

fn main() {
    let name = "1212";
    name = "123123";
}

image.png

当然我们存储用户输入的变量,肯定是一个可变的变量,所以我们需要使用mut关键字去修饰这个变量,让变量成为mutable

fn main() {
    let mut name = "1212";
    name = "123123";
}

image.png

变量的引用

&关键字用来引用变量的地址,因为我们要改变用来存储用户的输入变量,所以传入方法时,需要传递的是变量的指针

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之后,并没有报错:

image.png

字符串类型转换成数字类型

在这个游戏当中,用户输入之后,我们拿到的肯定是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是一门非常棒的语言,值得去学习,未来也是其它语言作为前端工具链的时代。

image.png