diff --git a/.travis.yml b/.travis.yml
index 9f7930e..0dc3437 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,12 +3,12 @@ dist: trusty
language: rust
cache: cargo
rust:
- - beta # Change this to stable when Rust 1.31.0 is out
+ - 1.37.0
branches:
only:
- master
before_script:
- - (cargo install mdbook --vers 0.1.7 --force || true)
+ - (cargo install mdbook --vers 0.2.3 --force || true)
script:
- mdbook build
- echo 'nojekyll' > book/.nojekyll
diff --git a/book.toml b/book.toml
index f3bcb0e..86cff4d 100644
--- a/book.toml
+++ b/book.toml
@@ -1,6 +1,6 @@
[book]
title = "Rust 程序设计语言 简体中文版"
-author = "Steve Klabnik 和 Carol Nichols,以及来自 Rust 社区的贡献,KaiserY 以及 Rust 中文社区翻译"
+author = "Steve Klabnik 和 Carol Nichols,以及来自 Rust 社区的贡献(Rust 中文社区翻译)"
description = "Rust 程序设计语言 简体中文版"
[build-dir]
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index 79923c4..75d7dd6 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -1,5 +1,6 @@
# Rust 程序设计语言
+[Rust 程序设计语言](title-page.md)
[前言](foreword.md)
[介绍](ch00-00-introduction.md)
@@ -36,7 +37,7 @@
## 基本 Rust 技能
-- [使用包、Crate和模块管理不断增长的项目](ch07-00-managing-growing-projects-with-packages-crates-and-modules.md)
+- [使用包、Crate 和模块管理不断增长的项目](ch07-00-managing-growing-projects-with-packages-crates-and-modules.md)
- [包和 crate](ch07-01-packages-and-crates.md)
- [定义模块来控制作用域与私有性](ch07-02-defining-modules-to-control-scope-and-privacy.md)
- [路径来引用模块树中的项](ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md)
diff --git a/src/ch00-00-introduction.md b/src/ch00-00-introduction.md
index f7a7106..3de3acf 100644
--- a/src/ch00-00-introduction.md
+++ b/src/ch00-00-introduction.md
@@ -56,11 +56,11 @@ Rust 语言也希望能支持很多其他用户,这里提及的只是最大的
你会在本书中发现两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小的程序。第二、十二和二十章是项目章节;其余都是概念章节。
-第一章介绍如何安装 Rust,如何编写 Hello, world! 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是 Rust 语言的实战介绍。我们会站在较高的层次介绍一些的概念,在稍后的章节种会做详细介绍。如果你希望立刻就动手实践一下,第二章正好适合你。开始阅读时,你甚至可能希望略过第三章,它介绍了 Rust 中类似其他编程语言中的功能,并直接阅读第四章学习 Rust 的所有权系统。然而,如果你是特别重视细节的学习者,并倾向于在继续之前学习每一个细节,你可能希望略过第二章并直接阅读第三章,并在想要构建项目来实践这些细节时再回来阅读第二章。
+第一章介绍如何安装 Rust,如何编写 “Hello, world!” 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是 Rust 语言的实战介绍。我们会站在较高的层次介绍一些的概念,在稍后的章节种会做详细介绍。如果你希望立刻就动手实践一下,第二章正好适合你。开始阅读时,你甚至可能希望略过第三章,它介绍了 Rust 中类似其他编程语言中的功能,并直接阅读第四章学习 Rust 的所有权系统。然而,如果你是特别重视细节的学习者,并倾向于在继续之前学习每一个细节,你可能希望略过第二章并直接阅读第三章,并在想要构建项目来实践这些细节时再回来阅读第二章。
第五章讨论结构体和方法,第六章介绍枚举、`match` 表达式和 `if let` 控制流结构。在 Rust 中,你将使用结构体和枚举创建自定义类型。
-第七章,你会学习 Rust 的模块系统和私有性规则来组织代码和公有应用程序接口(Application Programming Interface, API)。第八章讨论了一些标准库提供的常见集合数据结构,比如 vector、字符串和哈希 map。第九章探索了 Rust 的错误处理哲学和技术。
+第七章你会学习 Rust 的模块系统和私有性规则来组织代码和公有应用程序接口(Application Programming Interface, API)。第八章讨论了一些标准库提供的常见集合数据结构,比如 vector、字符串和哈希 map。第九章探索了 Rust 的错误处理哲学和技术。
第十章深入介绍泛型、trait 和生命周期,他们提供了定义出适用于多种类型的代码的能力。第十一章全部关于测试,即使 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章,我们构建了属于自己的在文件中搜索文本的命令行工具 `grep` 的子集功能实现。为此会利用之前章节讨论的很多概念。
diff --git a/src/ch01-01-installation.md b/src/ch01-01-installation.md
index 50efcba..5058250 100644
--- a/src/ch01-01-installation.md
+++ b/src/ch01-01-installation.md
@@ -2,7 +2,7 @@
> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/master/src/ch01-01-installation.md)
>
-> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
+> commit 27e741b227b6b946a1498ecc9d9dd1bff5819b82
第一步是安装 Rust。我们通过 `rustup` 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。
@@ -28,7 +28,7 @@ $ curl https://sh.rustup.rs -sSf | sh
Rust is installed now. Great!
```
-如果你愿意,可在运行前下载并检查该脚本。
+如果你愿意的话,可在运行前下载并检查该脚本。
此安装脚本自动将 Rust 加入系统 PATH 环境变量中,在下一次登录时生效。如果你希望立刻就开始使用 Rust 而不重启终端,在 shell 中运行如下命令,手动将 Rust 加入系统 PATH 变量中:
@@ -48,7 +48,7 @@ $ export PATH="$HOME/.cargo/bin:$PATH"
在 Windows 上,前往 [https://www.rust-lang.org/install.html][install] 并按照说明安装 Rust。在安装过程的某个步骤,你会收到一个信息说明为什么需要安装 Visual Studio 2013 或更新版本的 C++ build tools。获取这些 build tools 最方便的方法是安装 [Build Tools for Visual Studio 2019][visualstudio]。这个工具在 “Other Tools and Frameworks” 部分。
-[install]: https://www.rust-lang.org/install.html
+[install]: https://www.rust-lang.org/tools/install
[visualstudio]: https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2019
本书的余下部分会使用能同时运行于 *cmd.exe* 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。
@@ -81,10 +81,9 @@ $ rustc --version
rustc x.y.z (abcabcabc yyyy-mm-dd)
```
-如果出现这些内容,Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows,请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [irc.mozilla.org 上的 #rust IRC 频道][irc] ,可以使用 [Mibbit][mibbit] 来访问它。然后就能和其他 Rustacean(Rust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
+如果出现这些内容,Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows,请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 Rustacean(Rust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
-[irc]: irc://irc.mozilla.org/#rust
-[mibbit]: http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust
+[discord]: https://discord.gg/rust-lang
[users]: https://users.rust-lang.org/
[stackoverflow]: http://stackoverflow.com/questions/tagged/rust
diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md
index f7aebf8..66b1db5 100644
--- a/src/ch01-02-hello-world.md
+++ b/src/ch01-02-hello-world.md
@@ -2,7 +2,7 @@
> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/master/src/ch01-02-hello-world.md)
>
-> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
+> commit f63a103270ec8416899675a9cdb1c5cf6d77a498
既然安装好了 Rust,我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,我们将沿用这一传统!
@@ -12,9 +12,9 @@
首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 *projects* 目录,并将你的所有项目存放在这里。
-打开终端并输入如下命令创建 *projects* 目录,并在 *projects* 目录中为 Hello, world! 项目创建一个目录。
+打开终端并输入如下命令创建 *projects* 目录,并在 *projects* 目录中为 “Hello, world!” 项目创建一个目录。
-对于 Linux 和 macOS,输入:
+对于 Linux、macOS 和 Windows PowerShell,输入:
```text
$ mkdir ~/projects
@@ -32,15 +32,6 @@ $ cd hello_world
> cd hello_world
```
-对于 Windows PowerShell,输入:
-
-```powershell
-> mkdir $env:USERPROFILE\projects
-> cd $env:USERPROFILE\projects
-> mkdir hello_world
-> cd hello_world
-```
-
### 编写并运行 Rust 程序
接下来,新建一个源文件,命名为 *main.rs*。Rust 源文件总是以 *.rs* 扩展名结尾。如果文件名包含多个单词,使用下划线分隔它们。例如命名为 *hello_world.rs*,而不是 *helloworld.rs*。
@@ -73,13 +64,13 @@ Hello, world!
Hello, world!
```
-不管使用何种操作系统,终端应该打印字符串 `Hello, world!`。如果没有看到这些输出,回到 “故障排除” 部分查找寻求帮助的方法。
+不管使用何种操作系统,终端应该打印字符串 `Hello, world!`。如果没有看到这些输出,回到安装部分的 [“故障排除”][troubleshooting] 小节查找有帮助的方法。
如果 `Hello, world!` 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!
-### 分析 Rust 程序
+### 分析这个 Rust 程序
-现在,让我们回过头来仔细看看 Hello, world! 程序中到底发生了什么。这是第一块拼图:
+现在,让我们回过头来仔细看看 “Hello, world!” 程序中到底发生了什么。这是第一块拼图:
```rust
fn main() {
@@ -119,26 +110,17 @@ $ rustc main.rs
如果你有 C 或 C++ 背景,就会发现这与 `gcc` 和 `clang` 类似。编译成功后,Rust 会输出一个二进制的可执行文件。
-在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令也可以看见这个可执行文件,如下:
+在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令可以看见这个可执行文件。在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。
```text
-> ls
-
-
- Directory: Path:\to\the\project
-
-
-Mode LastWriteTime Length Name
----- ------------- ------ ----
--a---- 6/1/2018 7:31 AM 137728 main.exe
--a---- 6/1/2018 7:31 AM 1454080 main.pdb
--a---- 6/1/2018 7:31 AM 14 main.rs
+$ ls
+main main.rs
```
在 Windows 的 CMD 上,则输入如下内容:
```cmd
-> dir /B %= /B 参数表示只显示文件名 =%
+> dir /B %= the /B option says to only show the file names =%
main.exe
main.pdb
main.rs
@@ -150,8 +132,10 @@ main.rs
$ ./main # Windows 是 .\main.exe
```
-如果 *main.rs* 是上文所述的 Hello, world! 程序,它将会在终端上打印 `Hello, world!`。
+如果 *main.rs* 是上文所述的 “Hello, world!” 程序,它将会在终端上打印 `Hello, world!`。
如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript,则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 **预编译静态类型**(*ahead-of-time compiled*)语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 *.rb*、*.py* 或 *.js* 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,VM)。不过在这些语言中,只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。
仅仅使用 `rustc` 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。
+
+[troubleshooting]: ch01-01-installation.html#troubleshooting
\ No newline at end of file
diff --git a/src/ch01-03-hello-cargo.md b/src/ch01-03-hello-cargo.md
index 3780cf9..551af37 100644
--- a/src/ch01-03-hello-cargo.md
+++ b/src/ch01-03-hello-cargo.md
@@ -2,13 +2,13 @@
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/master/src/ch01-03-hello-cargo.md)
>
-> commit 7ccf60ad3b85e06ad0a2cb7c422dc80c42ecc963
+> commit f63a103270ec8416899675a9cdb1c5cf6d77a498
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖**(*dependencies*))。
-最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 Hello, world! 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的Rust程序时,你将添加依赖项,如果使用Cargo启动项目,则添加依赖项将更容易。
+最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
-由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:
+由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 [“安装”][installation] 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:
```text
$ cargo --version
@@ -53,7 +53,7 @@ edition = "2018"
第一行,`[package]`,是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。
-接下来的四行设置了 Cargo 编译程序所需的配置:项目的名称、版本、作者以及要使用的Rust版本。Cargo 从环境中获取你的名字和 email 信息,所以如果这些信息不正确,请修改并保存此文件。附录 E 会介绍 `edition` 的值。
+接下来的四行设置了 Cargo 编译程序所需的配置:项目的名称、版本、作者以及要使用的 Rust 版本。Cargo 从环境中获取你的名字和 email 信息,所以如果这些信息不正确,请修改并保存此文件。附录 E 会介绍 `edition` 的值。
最后一行,`[dependencies]`,是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 *crates*。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。
@@ -67,15 +67,15 @@ fn main() {
}
```
-Cargo 为你生成了一个 Hello World! 程序,正如我们之前编写的示例 1-1!目前为止,之前项目与 Cargo 生成项目的区别是 Cargo 将代码放在 *src* 目录,同时项目根目录包含一个 *Cargo.toml* 配置文件。
+Cargo 为你生成了一个 “Hello, world!” 程序,正如我们之前编写的示例 1-1!目前为止,之前项目与 Cargo 生成项目的区别是 Cargo 将代码放在 *src* 目录,同时项目根目录包含一个 *Cargo.toml* 配置文件。
Cargo 期望源文件存放在 *src* 目录中。项目根目录只存放 README、license 信息、配置文件和其他跟代码无关的文件。使用 Cargo 帮助你保持项目干净整洁,一切井井有条。
-如果没有用 Cargo 开始项目,比如我们创建的 Hello,world! 项目,可以将其转化为一个 Cargo 项目。将代码放入 *src* 目录,并创建一个合适的 *Cargo.toml* 文件。
+如果没有使用 Cargo 开始项目,比如我们创建的 Hello,world! 项目,可以将其转化为一个 Cargo 项目。将代码放入 *src* 目录,并创建一个合适的 *Cargo.toml* 文件。
### 构建并运行 Cargo 项目
-现在让我们看看通过 Cargo 构建和运行 Hello, world! 程序有什么不同!在 *hello_cargo* 目录下,输入下面的命令来构建项目:
+现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 *hello_cargo* 目录下,输入下面的命令来构建项目:
```text
$ cargo build
@@ -160,3 +160,5 @@ $ cargo build
* 使用 Cargo 创建并运行新项目
是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。
+
+[installation]: ch01-01-installation.html#installation
\ No newline at end of file
diff --git a/src/ch02-00-guessing-game-tutorial.md b/src/ch02-00-guessing-game-tutorial.md
index 17cf30c..ca55310 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 6d3e76820418f2d2bb203233c61d90390b5690f1
+> commit c427a676393d001edc82f1a54a3b8026abcf9690
让我们一起动手完成一个项目,来快速上手 Rust!本章将介绍 Rust 中一些常用概念,并通过真实的程序来展示如何运用它们。你将会学到 `let`、`match`、方法、关联函数、外部 crate 等知识!后续章节会深入探讨这些概念的细节。在这一章,我们将做基础练习。
@@ -126,7 +126,7 @@ let mut guess = String::new();
let foo = bar;
```
-这行代码新建了一个叫做 `foo` 的变量并把它绑定到值 `bar` 上。在 Rust 中,变量默认是不可变的。我们将会在第三章的 “变量与可变性” 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 `mut` 来使一个变量可变:
+这行代码新建了一个叫做 `foo` 的变量并把它绑定到值 `bar` 上。在 Rust 中,变量默认是不可变的。我们将会在第三章的 [“变量与可变性”][variables-and-mutability] 部分详细讨论这个概念。下面的例子展示了如何在变量名前使用 `mut` 来使一个变量可变:
```rust,ignore
let foo = 5; // 不可变
@@ -351,7 +351,7 @@ rand = "0.6.0"
### 生成一个随机数
-你已经把 `rand` crate 添加到 *Cargo.toml* 了,让我们开始 **使用** `rand` 吧。下一步是更新 *src/main.rs*,如示例 2-3 所示。
+你已经把 `rand` crate 添加到 *Cargo.toml* 了,让我们开始使用 `rand`。下一步是更新 *src/main.rs*,如示例 2-3 所示。
文件名: src/main.rs
@@ -456,7 +456,7 @@ error[E0308]: mismatched types
--> src/main.rs:23:21
|
23 | match guess.cmp(&secret_number) {
- | ^^^^^^^^^^^^^^ expected struct `std::string::String`, found integral variable
+ | ^^^^^^^^^^^^^^ expected struct `std::string::String`, found integer
|
= note: expected type `&std::string::String`
= note: found type `&{integer}`
@@ -507,7 +507,7 @@ let guess: u32 = guess.trim().parse()
[parse]: https://doc.rust-lang.org/std/primitive.str.html#method.parse
-`parse` 调用很容易产生错误。例如,字符串中包含 `A👍%`,就无法将其转换为一个数字。因此,`parse` 方法返回一个 `Result` 类型。像之前 “使用 `Result` 类型来处理潜在的错误” 讨论的 `read_line` 方法那样,再次按部就班的用 `expect` 方法处理即可。如果 `parse` 不能从字符串生成一个数字,返回一个 `Result` 的 `Err` 成员时,`expect` 会使游戏崩溃并打印附带的信息。如果 `parse` 成功地将字符串转换为一个数字,它会返回 `Result` 的 `Ok` 成员,然后 `expect` 会返回 `Ok` 值中的数字。
+`parse` 调用很容易产生错误。例如,字符串中包含 `A👍%`,就无法将其转换为一个数字。因此,`parse` 方法返回一个 `Result` 类型。像之前 [“使用 `Result` 类型来处理潜在的错误”](#handling-potential-failure-with-the-result-type) 讨论的 `read_line` 方法那样,再次按部就班的用 `expect` 方法处理即可。如果 `parse` 不能从字符串生成一个数字,返回一个 `Result` 的 `Err` 成员时,`expect` 会使游戏崩溃并打印附带的信息。如果 `parse` 成功地将字符串转换为一个数字,它会返回 `Result` 的 `Ok` 成员,然后 `expect` 会返回 `Ok` 值中的数字。
现在让我们运行程序!
@@ -555,7 +555,7 @@ Too big!
如上所示,我们将提示用户猜测之后的所有内容放入了循环。确保 loop 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊!
-用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 `parse`:如果用户输入的答案不是一个数字,程序会崩溃。用户可以利用这一点来退出,如下所示:
+用户总能使用 ctrl-c 终止程序。不过还有另一个方法跳出无限循环,就是 [“比较猜测与秘密数字”](#comparing-the-guess-to-the-secret-number) 部分提到的 `parse`:如果用户输入的答案不是一个数字,程序会崩溃。用户可以利用这一点来退出,如下所示:
```text
$ cargo run
@@ -587,7 +587,7 @@ error: Process didn't exit successfully: `target/debug/guess` (exit code: 101)
### 猜测正确后退出
-让我们增加一个 `break`,在用户猜对时退出游戏:
+让我们增加一个 `break` 语句,在用户猜对时退出游戏:
文件名: src/main.rs
@@ -710,3 +710,6 @@ fn main() {
此时此刻,你顺利完成了猜猜看游戏。恭喜!
本项目通过动手实践,向你介绍了 Rust 新概念:`let`、`match`、方法、关联函数、使用外部 crate 等等,接下来的几章,你会继续深入学习这些概念。第三章介绍大部分编程语言都有的概念,比如变量、数据类型和函数,以及如何在 Rust 中使用它们。第四章探索所有权(ownership),这是一个 Rust 同其他语言大不相同的功能。第五章讨论结构体和方法的语法,而第六章侧重解释枚举。
+
+[variables-and-mutability]:
+ch03-01-variables-and-mutability.html#variables-and-mutability
\ No newline at end of file
diff --git a/src/ch07-01-packages-and-crates.md b/src/ch07-01-packages-and-crates.md
index f6abdfd..a406be0 100644
--- a/src/ch07-01-packages-and-crates.md
+++ b/src/ch07-01-packages-and-crates.md
@@ -6,7 +6,7 @@
模块系统的第一部分,我们将介绍包和 crate 。 crate 是一个二进制项或者库。*crate root* 是一个源文件,Rust 编译器以它为起始点,并构成你的 crate 的根模块(我们将在“[Defining Modules to Control Scope and Privacy](https://github.com/rust-lang/book/blob/master/src/ch07-02-defining-modules-to-control-scope-and-privacy.md)”一节深入解读)。*包*(*package*)是提供一系列功能的一个或者多个 crate 。一个包会包含有一个*Cargo.toml*文件,阐述如何去构建这些 crate 。
-包所包含的内容,由几条规则来确立。一个包*必须*包含一个 crate 库或不含 crate 库,不能拥有多个。一个包必须包含一到多个 crate (库或者二进制项)。
+包中所包含的内容由几条规则来确立。一个包中至多 **只能** 包含一个库 crate(library crate);包中可以包含任意多个二进制 crate(binary crate);包中至少包含一个 crate,无论是库的还是二进制的。
让我们来看看创建包的时候会发生什么。首先,我们输入命令`cargo new`:
diff --git a/src/ch07-02-defining-modules-to-control-scope-and-privacy.md b/src/ch07-02-defining-modules-to-control-scope-and-privacy.md
index 42c2ef0..cbc7ecb 100644
--- a/src/ch07-02-defining-modules-to-control-scope-and-privacy.md
+++ b/src/ch07-02-defining-modules-to-control-scope-and-privacy.md
@@ -6,7 +6,7 @@
在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的*路径*(*paths*);用来将路径引入作用域的`use`关键字;以及使项变为公有的`pub`关键字。我们还将讨论`as`关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上!
-*模块*让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的*私有性*,即项是可以被外部代码使用的(*public*),还是作为一个内部实现的内容,不能呢个为外部代码使用(*private*)。
+*模块*让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的*私有性*,即项是可以被外部代码使用的(*public*),还是作为一个内部实现的内容,不能被外部代码使用(*private*)。
在餐饮业,餐馆中会有一些地方被称之为*前台*(*front of house*),还有另外一些地方被称之为*后台*(*back of house*)。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。
diff --git a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md
index 6ac7a60..37a45f4 100644
--- a/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md
+++ b/src/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.md
@@ -4,7 +4,7 @@
>
> commit cc6a1ef2614aa94003566027b285b249ccf961fa
-来看一下Rust如何模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。如果我们想要调用一个函数,我们需要知道它的路径。
+来看一下Rust如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。如果我们想要调用一个函数,我们需要知道它的路径。
路径有两种形式:
@@ -69,7 +69,7 @@ error[E0603]: module `hosting` is private
Rust中默认所有项(函数、方法、结构体、枚举、模块和常量)都是私有的。父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用他们父模块中的项。这是因为子模块封装并隐藏了他们的实现详情,但是子模块可以看到他们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。
-Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你您就知道可以更改内部代码的哪些部分而不会破坏外部代码。你还可以通过使用`pub`关键字来创建公共项,使子模块的内部部分暴露给上级模块。
+Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。你还可以通过使用`pub`关键字来创建公共项,使子模块的内部部分暴露给上级模块。
### 使用`pub`关键字暴露路径
diff --git a/src/ch10-02-traits.md b/src/ch10-02-traits.md
index 601221c..63865f5 100644
--- a/src/ch10-02-traits.md
+++ b/src/ch10-02-traits.md
@@ -243,7 +243,7 @@ fn some_function(t: T, u: U) -> i32
这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来类似没有很多 trait bounds 的函数。
-### 返回 trait
+### 返回实现了 trait 的类型
也可以在返回值中使用 `impl Trait` 语法,来返回实现了某个 trait 的类型:
diff --git a/src/foreword.md b/src/foreword.md
index 78d096b..d448ba9 100644
--- a/src/foreword.md
+++ b/src/foreword.md
@@ -1,8 +1,8 @@
# 前言
-> [foreword.md](https://github.com/rust-lang/book/blob/master/second-edition/src/foreword.md)
+> [foreword.md](https://github.com/rust-lang/book/blob/master/src/foreword.md)
>
-> commit 5e085bd1add34aec03416e891751552b439dde52
+> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
虽然不是那么明显,但 Rust 程序设计语言的本质在于 **赋能**(*empowerment*):无论你现在编写的是何种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。
diff --git a/src/title-page.md b/src/title-page.md
new file mode 100644
index 0000000..77b6655
--- /dev/null
+++ b/src/title-page.md
@@ -0,0 +1,30 @@
+# Rust 程序设计语言
+
+> [title-page.md](https://github.com/rust-lang/book/blob/master/src/title-page.md)
+>
+> commit 636685fd35ca04a98fa73312d92eb2a46987ac96
+
+**Steve Klabnik 和 Carol Nichols,以及来自 Rust 社区的贡献(Rust 中文社区翻译)**
+
+本书假设你使用 Rust 1.37.0 或更新的版本,且在所有的项目中的 *Cargo.toml* 文件中通过 `edition="2018"` 采用 Rust 2018 Edition 规范。请查看 [第一章的 “安装” 部分][install] 了解如何安装和升级 Rust,并查看新的 [附录 E][editions] 了解版本相关的信息。
+
+Rust 程序设计语言的 2018 Edition 包含许多的改进使得 Rust 更为工程化并更为容易学习。本书的此次迭代包括了很多反映这些改进的修改:
+
+- 第七章 “使用包、Crate 和模块管理不断增长的项目” 基本上被重写了。模块系统和路径(path)的工作方式变得更为一致。
+- 第十章新增了名为 “trait 作为参数” 和 “返回实现了 trait 的类型” 部分来解释新的 `impl Trait` 语法。
+- 第十一章新增了一个名为 “在测试中使用 `Result`” 的部分来展示如何使用 `?` 运算符来编写测试
+- 第十九章的 “高级生命周期” 部分被移除了,因为编译器的改进使得其内容变得更为少见。
+- 之前的附录 D “宏” 得到了补充,包括了过程宏并移动到了第十九章的 “宏” 部分。
+- 附录 A “关键字” 也介绍了新的原始标识符(raw identifiers)功能,这使得采用 2015 Edition 编写的 Rust 代码可以与 2018 Edition 互通。
+- 现在的附录 D 名为 “实用开发工具”,它介绍了最近发布的可以帮助你编写 Rust 代码的工具。
+- 我们还修复了全书中许多错误和不准确的描述。感谢报告了这些问题的读者们!
+
+注意任何 “Rust 程序设计语言” 早期迭代中的代码在项目的 *Cargo.toml* 中不包含 `edition="2018"` 时仍可以继续编译,哪怕你更新了 Rust 编译器的版本。Rust 的后向兼容性保证了这一切可以正常运行!
+
+本书的 HTML 版本可以在 [https://doc.rust-lang.org/stable/book/](https://doc.rust-lang.org/stable/book/) ([简体中文译本](https://kaisery.github.io/trpl-zh-cn/))在线阅读,离线版则包含在通过 `rustup` 安装的 Rust 中;运行 `rustup docs --book` 可以打开。
+
+本书的 [纸质版和电子书由 No Starch Press][nsprust] 发行。
+
+[install]: ch01-01-installation.html
+[editions]: appendix-05-editions.html
+[nsprust]: https://nostarch.com/rust
\ No newline at end of file