Merge pull request #3 from KaiserY/master

文本校正
pull/356/head
神谷润 5 years ago committed by GitHub
commit 1180fe5e27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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

@ -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]

@ -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)

@ -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` 的子集功能实现。为此会利用之前章节讨论的很多概念。

@ -2,7 +2,7 @@
> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/master/src/ch01-01-installation.md)
> <br>
> 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]<!-- ignore --> ,可以使用 [Mibbit][mibbit] 来访问它。然后就能和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
如果出现这些内容Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][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

@ -2,7 +2,7 @@
> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/master/src/ch01-02-hello-world.md)
> <br>
> 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* 文件,他们需要先分别安装 RubyPythonJavaScript 实现运行时环境VM。不过在这些语言中只需要一句命令就可以编译和运行程序。这一切都是语言设计上的权衡取舍。
仅仅使用 `rustc` 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。
[troubleshooting]: ch01-01-installation.html#troubleshooting

@ -2,13 +2,13 @@
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/master/src/ch01-03-hello-cargo.md)
> <br>
> 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

@ -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)
> <br>
> 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 所示。
<span class="filename">文件名: src/main.rs</span>
@ -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 循环中的代码多缩进四个空格,再次运行程序。注意这里有一个新问题,因为程序忠实地执行了我们的要求:永远地请求另一个猜测,用户好像无法退出啊!
用户总能使用 <span class="keystroke">ctrl-c</span> 终止程序。不过还有另一个方法跳出无限循环,就是 “比较猜测与秘密数字” 部分提到的 `parse`:如果用户输入的答案不是一个数字,程序会崩溃。用户可以利用这一点来退出,如下所示:
用户总能使用 <span class="keystroke">ctrl-c</span> 终止程序。不过还有另一个方法跳出无限循环,就是 [“比较猜测与秘密数字”](#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` 语句,在用户猜对时退出游戏:
<span class="filename">文件名: src/main.rs</span>
@ -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

@ -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`:

@ -6,7 +6,7 @@
在本节,我们将讨论模块和其它一些关于模块系统的部分,如允许你命名项的*路径**paths*);用来将路径引入作用域的`use`关键字;以及使项变为公有的`pub`关键字。我们还将讨论`as`关键字、外部包和 glob 运算符。现在,让我们把注意力放在模块上!
*模块*让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的*私有性*,即项是可以被外部代码使用的(*public*),还是作为一个内部实现的内容,不能呢个为外部代码使用(*private*)。
*模块*让我们可以将一个 crate 中的代码进行分组,以提高可读性与重用性。模块还可以控制项的*私有性*,即项是可以被外部代码使用的(*public*),还是作为一个内部实现的内容,不能外部代码使用(*private*)。
在餐饮业,餐馆中会有一些地方被称之为*前台**front of house*),还有另外一些地方被称之为*后台**back of house*)。前台是招待顾客的地方,在这里,店主可以为顾客安排座位,服务员接受顾客下单和付款,调酒师会制作饮品。后台则是由厨师工作的厨房,洗碗工的工作地点,以及经理做行政工作的地方组成。

@ -4,7 +4,7 @@
> <br>
> commit cc6a1ef2614aa94003566027b285b249ccf961fa
来看一下Rust如何模块树中找到一个项的位置我们使用路径的方式就像在文件系统使用路径一样。如果我们想要调用一个函数我们需要知道它的路径。
来看一下Rust如何模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。如果我们想要调用一个函数,我们需要知道它的路径。
路径有两种形式:
@ -69,7 +69,7 @@ error[E0603]: module `hosting` is private
Rust中默认所有项函数、方法、结构体、枚举、模块和常量都是私有的。父模块中的项不能使用子模块中的私有项但是子模块中的项可以使用他们父模块中的项。这是因为子模块封装并隐藏了他们的实现详情但是子模块可以看到他们定义的上下文。继续拿餐馆作比喻把私有性规则想象成餐馆的后台办公室餐馆内的事务对餐厅顾客来说是不可知的但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。
Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。你还可以通过使用`pub`关键字来创建公共项,使子模块的内部部分暴露给上级模块。
Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。你还可以通过使用`pub`关键字来创建公共项,使子模块的内部部分暴露给上级模块。
### 使用`pub`关键字暴露路径

@ -243,7 +243,7 @@ fn some_function<T, U>(t: T, u: U) -> i32
这个函数签名就显得不那么杂乱,函数名、参数列表和返回值类型都离得很近,看起来类似没有很多 trait bounds 的函数。
### 返回 trait
### 返回实现了 trait 的类型
也可以在返回值中使用 `impl Trait` 语法,来返回实现了某个 trait 的类型:

@ -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)
> <br>
> commit 5e085bd1add34aec03416e891751552b439dde52
> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
虽然不是那么明显,但 Rust 程序设计语言的本质在于 **赋能***empowerment*无论你现在编写的是何种代码Rust 能让你在更为广泛的编程领域走得更远,写出自信。

@ -0,0 +1,30 @@
# Rust 程序设计语言
> [title-page.md](https://github.com/rust-lang/book/blob/master/src/title-page.md)
> <br>
> 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<T, E>`” 的部分来展示如何使用 `?` 运算符来编写测试
- 第十九章的 “高级生命周期” 部分被移除了,因为编译器的改进使得其内容变得更为少见。
- 之前的附录 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
Loading…
Cancel
Save