diff --git a/src/ch00-00-introduction.md b/src/ch00-00-introduction.md
index c956870..5af1f27 100644
--- a/src/ch00-00-introduction.md
+++ b/src/ch00-00-introduction.md
@@ -2,7 +2,7 @@
> [ch00-00-introduction.md](https://github.com/rust-lang/book/blob/main/src/ch00-00-introduction.md)
>
-> commit 0aa307c7d79d2cbf83cdf5d47780b2904e9cb03f
+> commit 4921fde29ae8ccf67d5893d4e43d74284626fded
> 注意:本书的版本与出版的 [The Rust Programming Language][nsprust]
> 和电子版的 [No Starch Press][nsp] 一致
@@ -78,14 +78,13 @@ Rust 语言也希望能支持很多其他用户,这里提及的只是最大的
-学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息:它们会指导你编写出能工作的代码。为此,我们会提供很多不能编译的示例代码,以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码,它们可能无法编译!请确保阅读任何你尝试运行的示例周围的内容,检视他们是否有意写错。Ferris 也会帮助你区别那些有意无法工作的代码:
+学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息:它们会指导你编写出能工作的代码。为此,我们会提供很多不能编译的示例,以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码,它们可能无法编译!请确保阅读任何你尝试运行的示例周围的内容,检视他们是否有意写错。Ferris 也会帮助你区别那些有意无法工作的代码:
| Ferris | 意义 |
|------------------------------------------------------------------------|--------------------------------------------------|
-| | 这些代码不能编译! |
-| | 这些代码会 panic! |
-| | 这些代码块包含不安全(unsafe)代码。 |
-| | 这些代码不会产生期望的行为。 |
+| | 这些代码不能编译! |
+| | 这些代码会 panic! |
+| | 这些代码不会产生期望的行为。 |
在大部分情况,我们会指引你将任何不能编译的代码纠正为正确版本。
diff --git a/src/ch01-01-installation.md b/src/ch01-01-installation.md
index 299e955..65033d2 100644
--- a/src/ch01-01-installation.md
+++ b/src/ch01-01-installation.md
@@ -1,11 +1,11 @@
## 安装
> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/main/src/ch01-01-installation.md)
-> commit bad683bb7dcd06ef7f5f83bad3a25b1706b7b230
+> commit a01b23fee4c76a7e0d8c8c3261bdcf3a9840ccd3
第一步是安装 Rust。我们会通过 `rustup` 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。
-> 注意:如果你出于某些理由倾向于不使用 `rustup`,请到 [Rust 安装页面](https://www.rust-lang.org/install.html) 查看其它安装选项。
+> 注意:如果你出于某些理由倾向于不使用 `rustup`,请参阅 [Rust 的其他安装方法页面](https://forge.rust-lang.org/infra/other-installation-methods.html) 了解更多选项。
接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。
@@ -27,7 +27,15 @@ $ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
Rust is installed now. Great!
```
-另外,你需要一个某种类型的链接器(linker)。很有可能已经安装,不过当你尝试编译 Rust 程序时,却有错误指出无法执行链接器,这意味着你的系统上没有安装链接器,你需要自行安装一个。C 编译器通常带有正确的链接器。请查看你使用平台的文档,了解如何安装 C 编译器。并且,一些常用的 Rust 包依赖 C 代码,也需要安装 C 编译器。因此现在安装一个是值得的。
+另外,你还需要一个链接器(linker),这是 Rust 用来将其编译的输出连接到一个文件中的程序。很可能你已经有一个了。如果你遇到了链接器错误,请尝试安装一个 C 编译器,它通常包括一个链接器。C 编译器也很有用,因为一些常见的 Rust 包依赖于 C 代码,因此需要安装一个 C 编译器。
+
+在 macOS 上,你可以通过运行以下命令获得 C 语言编译器:
+
+```console
+$ xcode-select --install
+```
+
+根据发行版的文档,Linux 用户通常应该安装 GCC 或 Clang。例如,如果你使用 Ubuntu,则可以安装 则可以安装 `build-essential` 包。
### 在 Windows 上安装 `rustup`
diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md
index 9627d5d..e13bfff 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/main/src/ch01-02-hello-world.md)
>
-> commit f63a103270ec8416899675a9cdb1c5cf6d77a498
+> commit ee7c5776a958353a2be0e3787fffa9523638d0fa
既然安装好了 Rust,我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,我们将沿用这一传统!
@@ -16,7 +16,7 @@
对于 Linux、macOS 和 Windows PowerShell,输入:
-```text
+```console
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
@@ -50,7 +50,7 @@ fn main() {
保存文件,并回到终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件:
-```text
+```console
$ rustc main.rs
$ ./main
Hello, world!
@@ -82,7 +82,9 @@ fn main() {
还须注意,函数体被包裹在花括号中,`{}`。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
-在编写本书的时候,一个叫做 `rustfmt` 的自动格式化工具正在开发中。如果你希望在 Rust 项目中保持一种标准风格,`rustfmt` 会将代码格式化为特定的风格。Rust 团队计划最终将该工具包含在标准 Rust 发行版中,就像 `rustc`。所以根据你阅读本书的时间,它可能已经安装到你的电脑中了!检查在线文档以了解更多细节。
+如果要在Rust项目中坚持使用标准样式,可以使用名为rustfmt的自动格式化工具将代码格式化为特定样式。Rust团队已经在标准的Rust发行版中包含了这个工具,比如rustc,所以它应该已经安装在您的计算机上了!有关更多详细信息,请查看在线文档。
+
+如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 `rustfmt` 的自动格式化工具将代码格式化为特定的风格。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 `rustc`。所以它应该已经安装在你的电脑中了!检查在线文档以了解更多细节。
在 `main()` 函数中是如下代码:
@@ -92,7 +94,7 @@ fn main() {
这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。
-第二,`println!` 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 `println`(没有`!`)。我们将在第十九章详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数。
+第二,`println!` 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 `println`(没有`!`)。我们将在第十九章详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数,并且宏并不总是遵循与函数相同的规则。
第三,`"Hello, world!"` 是一个字符串。我们把这个字符串作为一个参数传递给 `println!`,字符串将被打印到屏幕上。
@@ -104,7 +106,7 @@ fn main() {
在运行 Rust 程序之前,必须先使用 Rust 编译器编译它,即输入 `rustc` 命令并传入源文件名称,如下:
-```text
+```console
$ rustc main.rs
```
@@ -112,7 +114,7 @@ $ rustc main.rs
在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令可以看见这个可执行文件。在 Linux 和 macOS,你会看到两个文件。在 Windows PowerShell 中,你会看到同使用 CMD 相同的三个文件。
-```text
+```console
$ ls
main main.rs
```
@@ -128,7 +130,7 @@ main.rs
这展示了扩展名为 *.rs* 的源文件、可执行文件(在 Windows 下是 *main.exe*,其它平台是 *main*),以及当使用 CMD 时会有一个包含调试信息、扩展名为 *.pdb* 的文件。从这里开始运行 *main* 或 *main.exe* 文件,如下:
-```text
+```console
$ ./main # Windows 是 .\main.exe
```
diff --git a/src/ch01-03-hello-cargo.md b/src/ch01-03-hello-cargo.md
index 27b48db..e0453c9 100644
--- a/src/ch01-03-hello-cargo.md
+++ b/src/ch01-03-hello-cargo.md
@@ -2,7 +2,7 @@
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/main/src/ch01-03-hello-cargo.md)
>
-> commit f63a103270ec8416899675a9cdb1c5cf6d77a498
+> commit c032e945406dd8ef2ce2062aa1f9d65dbf9020d6
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖**(*dependencies*))。
@@ -10,7 +10,7 @@ Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Ca
由于绝大多数 Rust 项目使用 Cargo,本书接下来的部分假设你也使用 Cargo。如果使用 [“安装”][installation] 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话,可以在终端输入如下命令检查是否安装了 Cargo:
-```text
+```console
$ cargo --version
```
@@ -18,16 +18,16 @@ $ cargo --version
### 使用 Cargo 创建项目
-我们使用 Cargo 创建一个新项目,然后看看与上面的 Hello, world! 项目有什么不同。回到 *projects* 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令:
+我们使用 Cargo 创建一个新项目,然后看看与上面的 “Hello, world!” 项目有什么不同。回到 *projects* 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令:
-```text
+```console
$ cargo new hello_cargo
$ cd hello_cargo
```
第一行命令新建了名为 *hello_cargo* 的目录。我们将项目命名为 *hello_cargo*,同时 Cargo 在一个同名目录中创建项目文件。
-进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中的 *main.rs* 文件。它也在 *hello_cargo* 目录初始化了一个 git 仓库,以及一个 *.gitignore* 文件。
+进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中的 *main.rs* 文件。它也在 *hello_cargo* 目录初始化了一个 git 仓库,以及一个 *.gitignore* 文件。如果你在现有的 git 仓库中运行 `cargo new`,则不会生成 git 文件;你可以通过使用`cargo new --vcs=git` 来覆盖此行为。
> 注意:Git 是一个常用的版本控制系统(version control system, VCS)。可以通过 `--vcs` 参数使 `cargo new` 切换到其它版本控制系统(VCS),或者不使用 VCS。运行 `cargo new --help` 参看可用的选项。
@@ -39,7 +39,6 @@ $ cd hello_cargo
[package]
name = "hello_cargo"
version = "0.1.0"
-authors = ["Your Name "]
edition = "2018"
[dependencies]
@@ -47,13 +46,11 @@ edition = "2018"
示例 1-2: *cargo new* 命令生成的 *Cargo.toml* 的内容
-这个文件使用 [*TOML*][toml] (*Tom's Obvious, Minimal Language*) 格式,这是 Cargo 配置文件的格式。
-
-[toml]: https://github.com/toml-lang/toml
+这个文件使用 [*TOML*](https://toml.io) (*Tom's Obvious, Minimal Language*) 格式,这是 Cargo 配置文件的格式。
第一行,`[package]`,是一个片段(section)标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段(section)。
-接下来的四行设置了 Cargo 编译程序所需的配置:项目的名称、版本、作者以及要使用的 Rust 版本。Cargo 从环境中获取你的名字和 email 信息,所以如果这些信息不正确,请修改并保存此文件。附录 E 会介绍 `edition` 的值。
+接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、版本以及要使用的 Rust 版本。[附录 E][appendix-e] 会介绍 `edition` 的值。
最后一行,`[dependencies]`,是罗列项目依赖的片段的开始。在 Rust 中,代码包被称为 *crates*。这个项目并不需要其他的 crate,不过在第二章的第一个项目会用到依赖,那时会用得上这个片段。
@@ -77,7 +74,7 @@ Cargo 期望源文件存放在 *src* 目录中。项目根目录只存放 README
现在让我们看看通过 Cargo 构建和运行 “Hello, world!” 程序有什么不同!在 *hello_cargo* 目录下,输入下面的命令来构建项目:
-```text
+```console
$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
@@ -85,7 +82,7 @@ $ cargo build
这个命令会创建一个可执行文件 *target/debug/hello_cargo* (在 Windows 上是 *target\debug\hello_cargo.exe*),而不是放在目前目录下。可以通过这个命令运行可执行文件:
-```text
+```console
$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
Hello, world!
```
@@ -94,7 +91,7 @@ Hello, world!
我们刚刚使用 `cargo build` 构建了项目,并使用 `./target/debug/hello_cargo` 运行了程序,也可以使用 `cargo run` 在一个命令中同时编译并运行生成的可执行文件:
-```text
+```console
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
@@ -103,7 +100,7 @@ Hello, world!
注意这一次并没有出现表明 Cargo 正在编译 `hello_cargo` 的输出。Cargo 发现文件并没有被改变,就直接运行了二进制文件。如果修改了源文件的话,Cargo 会在运行之前重新构建项目,并会出现像这样的输出:
-```text
+```console
$ cargo run
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
@@ -113,7 +110,7 @@ Hello, world!
Cargo 还提供了一个叫 `cargo check` 的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件:
-```text
+```console
$ cargo check
Checking hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
@@ -123,8 +120,9 @@ $ cargo check
我们回顾下已学习的 Cargo 内容:
-* 可以使用 `cargo build` 或 `cargo check` 构建项目。
+* 可以使用 `cargo build` 构建项目。
* 可以使用 `cargo run` 一步构建并运行项目。
+* 可以在不生成二进制文件的情况下构建项目并使用 `cargo check` 检查错误。
* 有别于将构建结果放在与源码相同的目录,Cargo 会将其放到 *target/debug* 目录。
使用 Cargo 的一个额外的优点是,不管你使用什么操作系统,其命令都是一样的。所以从现在开始本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。
@@ -139,8 +137,8 @@ $ cargo check
即便 `hello_cargo` 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:
-```text
-$ git clone someurl.com/someproject
+```console
+$ git clone example.org/someproject
$ cd someproject
$ cargo build
```
@@ -162,3 +160,4 @@ $ cargo build
是时候通过构建更实质性的程序来熟悉读写 Rust 代码了。所以在第二章我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。
[installation]: ch01-01-installation.html#installation
+[appendix-e]: appendix-05-editions.html
\ No newline at end of file
diff --git a/src/img/ferris/unsafe.svg b/src/img/ferris/unsafe.svg
deleted file mode 100644
index d4fdc08..0000000
--- a/src/img/ferris/unsafe.svg
+++ /dev/null
@@ -1,291 +0,0 @@
-
-
-
-