【Rust】第三节:一个小引子-猜数字游戏

1 前言

本节开始,不区分运行环境是MacOS还是Windows还是Linux
本节完成了一个“猜数字游戏”,也就是系统生成一个数字,用户猜一个数字,系统提示大了或者小了直至猜中
通过本节的学习,可以对语法、风格、库等内容有一个粗略的了解,当然在学习过程中可能会产生更多的问题,问题都会在后续的章节中进行解答

2 代码

强烈建议你直接阅读文档,本文会对我学习过程中的一些关注点进行梳理,总结尽量准确,如果内容有偏差不准确处可以提出,我会进行修订,感谢
这里先直接放上最终完整版的,经过chatgpt和我注释的代码,新建项目,完成修改后,可以cargo run直接运行

// main.rs 文件
// 导入 rand 模块中的 Rng trait
use rand::Rng;
// 导入 std 库中的 cmp 模块的 Ordering 枚举
use std::cmp::Ordering;
// 导入 std 库中的 io 模块
use std::io;

fn main() {
   
    // 打印猜数字的欢迎消息
    println!("Guess the number!");

    // 生成一个随机的秘密数字,范围是 1 到 100(不包括 101)
    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();

        // 从标准输入读取用户的猜测,并将其存储到 guess 变量中
        io::stdin()
            .read_line(&mut guess)
            .expect("Fail to read line");

        // 将用户输入的字符串转换为无符号整数(u32),如果失败则继续下一次循环
        let guess: u32 = match guess.trim().parse() {
   
            Ok(num) => num, // 异常处理,num类型则读取
            Err(_) => continue, // 异常处理,非num类型则继续下一个循环而不直接失败,'_'是通配符
        };

        // 打印用户的猜测
        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;
            }
        }
    }
}

# Cargo.toml 文件
# 指定包的元数据
[package]
name = "guessing_game"  # 包的名称
version = "0.1.0"       # 包的版本
edition = "2021"         # Rust 编译器版本

# 更多键和它们的定义可以在以下链接找到:https://doc.rust-lang.org/cargo/reference/manifest.html

# 指定项目的依赖关系
[dependencies]
rand = "0.8.3"  # 依赖 rand 库的版本号,Cargo 会根据这个版本号下载相应的库

3 重点

3.1 风格

1、默认使用4个空格进行缩进,而不是制表符
2、每句的结尾必须使用;
3、多个枚举值场景判断之间用,

3.2 语法

1、变量定义。用let定义,默认为不可变的变量,加上mut也就是mutability则是可变变量
2、变量类型。可以通过String::new()来给变量初始化为字符串类型,值得说明的是,变量类型是根据内容进行推断的,且不可变,具体会在后续章节展开
3、变量引用。&表示引用,使不同的代码访问同一数据且无需内存拷贝,如果访问的是可变的变量,需要&mut guess
4、异常处理。会产生Result的枚举值,包含OkErr。可以使用expect进行异常处理,也可以对OkErr分别处理
5、比较。使用cmp方法,注意不同类型的变量无法比较,比如字符串与数字,所以需要先转化成相同的类型。
6、匹配。使用match方法,代码中的ResultOkErr),OrderingLessGreaterEqual)都是枚举值。一个match拥有多个分支(arm),每一个分支都是一种匹配模式(pattern)以及对应的处理逻辑。

3.3 库

1、通过use的方式引入。
2、std的库可以直接引入。
3、非std的库,需要在toml中添加dependencies,并指定对应的版本。0.8.3的意思实际是^0.8.3,也即至少0.8.3但不大于0.9.0的版本。
4、cargo build会生成一个Cargo.lock的文件,指定版本,从而能重现构建,直到你显式地升级依赖的版本。
5、cargo update会忽略Cargo.lock,并使用目前基于Cargo.toml的最新版本,并更新Cargo.lock
6、值得注意的是,本次虽然之引入rand这一个非std的库,但是cargo会自动地获取其所以来的其他所有的库来保证能正常运行
7、by the way 补一嘴,cargo中,依赖是从registry上获取,是来自Crates.io的数据拷贝,Crates.io是Rust生态环境下,开发者们贡献Rust开源项目的地方。

3.4 其他

chatgpt不一定准确,通过chatgpt注释上面的代码检查时有发现错误…但是可以参考

4 问题

相信看完这一章,还会有很多的问题
比如变量有哪些类型,怎么定义、某些场景下能不能转换、rust的引用是怎么用的、怎么定义函数、::.在方法使用和引入上分别是什么意思,比较复杂的代码用什么方式编写,crate怎么使用与管理、枚举值、输入输出等等等等
本节只是一个简单的引入,这些问题会在后面的章节中,逐步展开

5 参考

Rust程序设计语言

相关推荐

  1. Rust三节一个引子-数字游戏

    2023-12-10 00:36:02       47 阅读
  2. 学习 Rust三天:如何编写一个数字游戏

    2023-12-10 00:36:02       12 阅读
  3. 数字游戏

    2023-12-10 00:36:02       19 阅读
  4. 用Python搭建一个数字游戏

    2023-12-10 00:36:02       16 阅读
  5. 用MATLAB编写一个数字游戏

    2023-12-10 00:36:02       18 阅读
  6. Rust 练手项目:游戏

    2023-12-10 00:36:02       14 阅读
  7. PyQt6数字游戏

    2023-12-10 00:36:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 00:36:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 00:36:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 00:36:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 00:36:02       20 阅读

热门阅读

  1. MySQL注入入门简述

    2023-12-10 00:36:02       40 阅读
  2. CCF计算机软件能力认证考试—202209-1如此编码

    2023-12-10 00:36:02       28 阅读
  3. 高云GW1NSR-4C开发板上手使用

    2023-12-10 00:36:02       43 阅读
  4. 【Qt5】setWindowFlags的标志有哪些?

    2023-12-10 00:36:02       30 阅读
  5. 车联网安全学习路标

    2023-12-10 00:36:02       40 阅读
  6. 如何访问内部网络做内网穿透

    2023-12-10 00:36:02       41 阅读
  7. GO设计模式——7、适配器模式(结构型)

    2023-12-10 00:36:02       28 阅读