From ba2b40a0edba6e9f0f3d9c4b7870448b6ffe21f7 Mon Sep 17 00:00:00 2001 From: shengurun Date: Wed, 9 Oct 2019 11:00:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(ch02-00):=20=E6=9B=B4=E6=96=B0=E6=95=99?= =?UTF-8?q?=E7=A8=8B=E5=86=85=E5=AE=B9=E8=87=B3=E5=8E=9F=E6=96=87commit=20?= =?UTF-8?q?hash->6d3e768?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修改该章开头的commit hash。 2. 将rand包版本改为“0.5.5”,并修改了相关的内容。 3. “生成一个随机数”一节进行删除修改,以符合原文。 --- src/ch02-00-guessing-game-tutorial.md | 49 +++++++++++++++------------ 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/ch02-00-guessing-game-tutorial.md b/src/ch02-00-guessing-game-tutorial.md index 4ce9676..17cf30c 100644 --- a/src/ch02-00-guessing-game-tutorial.md +++ b/src/ch02-00-guessing-game-tutorial.md @@ -2,7 +2,7 @@ > [ch02-00-guessing-game-tutorial.md](https://github.com/rust-lang/book/blob/master/src/ch02-00-guessing-game-tutorial.md) >
-> commit a86c1d315789b3ca13b20d50ad5005c62bdd9e37 +> commit 6d3e76820418f2d2bb203233c61d90390b5690f1 让我们一起动手完成一个项目,来快速上手 Rust!本章将介绍 Rust 中一些常用概念,并通过真实的程序来展示如何运用它们。你将会学到 `let`、`match`、方法、关联函数、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将做基础练习。 @@ -28,6 +28,7 @@ $ cd guessing_game name = "guessing_game" version = "0.1.0" authors = ["Your Name "] +edition = "2018" [dependencies] ``` @@ -265,10 +266,10 @@ Cargo 对外部 crate 的运用是其真正闪光的地方。在我们使用 `ra ```toml [dependencies] -rand = "0.3.14" +rand = "0.5.5" ``` -在 *Cargo.toml* 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。`[dependencies]` 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 `0.3.14` 来指定 `rand` crate。Cargo 理解[语义化版本(Semantic Versioning)][semver](有时也称为 *SemVer*),这是一种定义版本号的标准。`0.3.14` 事实上是 `^0.3.14` 的简写,它表示 “任何与 0.3.14 版本公有 API 相兼容的版本”。 +在 *Cargo.toml* 文件中,标题以及之后的内容属同一个片段,直到遇到下一个标题才开始新的片段。`[dependencies]` 片段告诉 Cargo 本项目依赖了哪些外部 crate 及其版本。本例中,我们使用语义化版本 `0.5.5` 来指定 `rand` crate。Cargo 理解[语义化版本(Semantic Versioning)][semver](有时也称为 *SemVer*),这是一种定义版本号的标准。`0.5.5` 事实上是 `^0.5.5` 的简写,它表示 “任何与 0.5.5 版本公有 API 相兼容的版本”。 [semver]: http://semver.org @@ -276,13 +277,19 @@ rand = "0.3.14" ```text $ cargo build - Updating registry `https://github.com/rust-lang/crates.io-index` - Downloading rand v0.3.14 - Downloading libc v0.2.14 - Compiling libc v0.2.14 - Compiling rand v0.3.14 + Updating crates.io index + Downloaded rand v0.5.5 + Downloaded libc v0.2.62 + Downloaded rand_core v0.2.2 + Downloaded rand_core v0.3.1 + Downloaded rand_core v0.4.2 + Compiling rand_core v0.4.2 + Compiling libc v0.2.62 + Compiling rand_core v0.3.1 + Compiling rand_core v0.2.2 + Compiling rand v0.5.5 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) - Finished dev [unoptimized + debuginfo] target(s) in 2.53 secs + Finished dev [unoptimized + debuginfo] target(s) in 2.53 s ``` 示例 2-2: 将 rand crate 添加为依赖之后运行 `cargo build` 的输出 @@ -293,7 +300,7 @@ $ cargo build [cratesio]: https://crates.io -在更新完 registry 后,Cargo 检查 `[dependencies]` 片段并下载缺失的 crate 。本例中,虽然只声明了 `rand` 一个依赖,然而 Cargo 还是额外获取了 `libc` 的拷贝,因为 `rand` 依赖 `libc` 来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。 +在更新完 registry 后,Cargo 检查 `[dependencies]` 片段并下载缺失的 crate 。本例中,虽然只声明了 `rand` 一个依赖,然而 Cargo 还是额外获取了 `libc` 和 `rand_core` 的拷贝,因为 `rand` 依赖 `libc` 来正常工作。下载完成后,Rust 编译依赖,然后使用这些依赖编译项目。 如果不做任何修改,立刻再次运行 `cargo build`,则不会看到任何除了 `Finished` 行之外的输出。Cargo 知道它已经下载并编译了依赖,同时 *Cargo.toml* 文件也没有变动。Cargo 还知道代码也没有任何修改,所以它不会重新编译代码。因为无事可做,它简单的退出了。 @@ -309,30 +316,30 @@ $ cargo build #### *Cargo.lock* 文件确保构建是可重现的 -Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周 `rand` crate 的 `0.3.15` 版本出来了,它修复了一个重要的 bug,同时也含有一个会破坏代码运行的缺陷,这时会发生什么呢? +Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周 `rand` crate 的 `0.5.6` 版本出来了,它修复了一个重要的 bug,同时也含有一个会破坏代码运行的缺陷,这时会发生什么呢? -这个问题的答案是 *Cargo.lock* 文件。它在第一次运行 `cargo build` 时创建,并放在 *guessing_game* 目录。当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 *Cargo.lock* 文件。当将来构建项目时,Cargo 会发现 *Cargo.lock* 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 `0.3.14` 直到你显式升级,多亏有了 *Cargo.lock* 文件。 +这个问题的答案是 *Cargo.lock* 文件。它在第一次运行 `cargo build` 时创建,并放在 *guessing_game* 目录。当第一次构建项目时,Cargo 计算出所有符合要求的依赖版本并写入 *Cargo.lock* 文件。当将来构建项目时,Cargo 会发现 *Cargo.lock* 已存在并使用其中指定的版本,而不是再次计算所有的版本。这使得你拥有了一个自动化的可重现的构建。换句话说,项目会持续使用 `0.5.5` 直到你显式升级,多亏有了 *Cargo.lock* 文件。 #### 更新 crate 到一个新版本 当你 **确实** 需要升级 crate 时,Cargo 提供了另一个命令,`update`,它会忽略 *Cargo.lock* 文件,并计算出所有符合 *Cargo.toml* 声明的最新版本。如果成功了,Cargo 会把这些版本写入 *Cargo.lock* 文件。 -不过,Cargo 默认只会寻找大于 `0.3.0` 而小于 `0.4.0` 的版本。如果 `rand` crate 发布了两个新版本,`0.3.15` 和 `0.4.0`,在运行 `cargo update` 时会出现如下内容: +不过,Cargo 默认只会寻找大于 `0.5.5` 而小于 `0.6.0` 的版本。如果 `rand` crate 发布了两个新版本,`0.5.6` 和 `0.6.0`,在运行 `cargo update` 时会出现如下内容: ```text $ cargo update - Updating registry `https://github.com/rust-lang/crates.io-index` - Updating rand v0.3.14 -> v0.3.15 + Updating crates.io index + Updating rand v0.5.5 -> v0.5.6 ``` -这时,你也会注意到的 *Cargo.lock* 文件中的变化无外乎现在使用的 `rand` crate 版本是`0.3.15` +这时,你也会注意到的 *Cargo.lock* 文件中的变化无外乎现在使用的 `rand` crate 版本是`0.5.6` -如果想要使用 `0.4.0` 版本的 `rand` 或是任何 `0.4.x` 系列的版本,必须像这样更新 *Cargo.toml* 文件: +如果想要使用 `0.6.0` 版本的 `rand` 或是任何 `0.6.x` 系列的版本,必须像这样更新 *Cargo.toml* 文件: ```toml [dependencies] -rand = "0.4.0" +rand = "0.6.0" ``` 下一次运行 `cargo build` 时,Cargo 会从 registry 更新可用的 crate,并根据你指定的新版本重新计算。 @@ -372,11 +379,9 @@ fn main() { 示例 2-3:添加生成随机数的代码 -首先,这里新增了一行通知 Rust 我们要使用外部依赖 `rand`。这等同于调用 `use rand`,所以现在可以使用 `rand::` 前缀来调用 `rand` crate 中的任何内容。 - -接下来增加了另一行 `use`:`use rand::Rng`。`Rng` 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。 +首先,我们新增了一行 `use`:`use rand::Rng`。`Rng` 是一个 trait,它定义了随机数生成器应实现的方法,想使用这些方法的话,此 trait 必须在作用域中。第十章会详细介绍 trait。 -另外,中间还新增加了两行。`rand::thread_rng` 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接下来,调用随机数生成器的 `gen_range` 方法。这个方法由刚才引入到作用域的 `Rng` trait 定义。`gen_range` 方法获取两个数字作为参数,并生成一个范围在两者之间的随机数。它包含下限但不包含上限,所以需要指定 `1` 和 `101` 来请求一个 1 和 100 之间的数。 +接下来,我们在中间还新增加了两行。`rand::thread_rng` 函数提供实际使用的随机数生成器:它位于当前执行线程的本地环境中,并从操作系统获取 seed。接下来,调用随机数生成器的 `gen_range` 方法。这个方法由刚才引入到作用域的 `Rng` trait 定义。`gen_range` 方法获取两个数字作为参数,并生成一个范围在两者之间的随机数。它包含下限但不包含上限,所以需要指定 `1` 和 `101` 来请求一个 1 和 100 之间的数。 > 注意:你不可能凭空就知道应该 use 哪个 trait 以及该从 crate 中调用哪个方法。crate 的使用说明位于其文档中。Cargo 有一个很棒的功能是:运行 `cargo doc --open` 命令来构建所有本地依赖提供的文档,并在浏览器中打开。例如,假设你对 `rand` crate 中的其他功能感兴趣,你可以运行 `cargo doc --open` 并点击左侧导航栏中的 `rand`。