type
Post
date
Oct 28, 2025
slug
Rust/notebook/2
summary
学习下 Rust 圣经,记录笔记
status
Published
tags
Rust
category
技术茶点
icon
password
实现一个经典的新手编程问题:猜数字游戏。游戏的规则如下:程序将会生成一个 1 到 100 之间的随机整数。然后提示玩家输入一个猜测值。输入后,程序会指示该猜测是太低还是太高。如果猜对了,游戏会打印祝贺信息并退出。

2.编写猜数字游戏

2.1.创建项目、编译并运行

2.2.在main.rs中编写代码

2.2.1.从键盘获取输入并打印

  • cargo run 运行结果

    2.2.2.生成一个随机数

    • 引入依赖 rand
    • [dependencies]——本项目依赖了哪些外部 crate 及其版本
    • cargo build
      • 下载并编译了依赖
      • 在更新完 registry 后,Cargo 检查 [dependencies] section 并下载列表中包含但还未下载的 crate。本例中,虽然只声明了 rand 一个依赖,然而 Cargo 还是额外获取了 rand 所需要的其他 crate,因为 rand 依赖它们来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。
      • 将 rand crate 添加为依赖之后运行 `cargo build` 的输出
      • 再次运行 cargo build
        • 修改一些 main.rs 中的代码后运行 cargo build
          • 这一行表示 Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码
          • 当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 Cargo.lock 文件。
          • 当将来构建项目时,Cargo 会发现 Cargo.lock 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现构建(reproducible build)
          • 当你 确实 需要升级 crate 时,Cargo 提供了这样一个命令,update,它会忽略 Cargo.lock 文件,并计算出所有符合 Cargo.toml 声明的最新版本
            • 更新 Cargo.toml 文件
              • 下一次运行 cargo build 时,Cargo 会更新可用 crate 的 registry,并根据你指定的新版本重新评估 rand 的要求
          • 解释
            • cargo doc --open 命令来构建所有本地依赖提供的文档并在浏览器中打开
            • 更新代码

              2.2.3.比较猜测的数字和随机数

              • Ordering 也是一个枚举,不过它的成员是 LessGreater 和 Equal。这是比较两个值时可能出现的三种结果
              • 使用一个 match 表达式,根据对 guess 和 secret_number 调用 cmp 返回的 Ordering 成员来决定接下来做什么
              • 一个 match 表达式由 分支(arms) 构成。一个分支包含一个 模式pattern)和表达式开头的值与分支模式相匹配时应该执行的代码
              • 错误的核心表明这里有 不匹配的类型mismatched types)。Rust 有一个静态强类型系统,同时也有类型推断。当我们写出 let guess = String::new() 时,Rust 推断出 guess 应该是 String 类型,并不需要我们写出类型。另一方面,secret_number,是数字类型。几个数字类型拥有 1 到 100 之间的值:32 位数字 i32;32 位无符号数字 u32;64 位数字 i64 等等。Rust 默认使用 i32,所以它是 secret_number 的类型,除非增加类型信息,或任何能让 Rust 推断出不同数值类型的信息。这里错误的原因在于 Rust 不会比较字符串类型和数字类型
              • parse 方法只有在字符逻辑上可以转换为数字的时候才能工作所以非常容易出错,再次按部就班的用 expect 方法处理即可
                • String 实例的 trim 方法会去除字符串开头和结尾的空白字符,我们必须执行此方法才能将字符串与 u32 比较,因为 u32 只能包含数值型数据
                • 如果 parse 成功地将字符串转换为一个数字,它会返回 Result 的 Ok 成员,然后 expect 会返回 Ok 值中的数字

              2.2.4.使用循环以允许多次猜测

              • 关联解释
                • 逐行解释
                  《Rust 程序设计语言》(3/22)《Rust 程序设计语言》(1/22)
                  Loading...