Merge remote-tracking branch 'upstream/master'

pull/251/head
spartucus 7 years ago
commit 32b902f3f7

@ -11,6 +11,7 @@ before_script:
- (cargo install mdbook --vers 0.1.7 --force || true)
script:
- mdbook build
- echo 'nojekyll' > book/.nojekyll
deploy:
provider: pages
local-dir: book

@ -1,25 +0,0 @@
# 介绍
> [ch01-00-introduction.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-00-introduction.md)
> <br>
> commit d06a6a181fd61704cbf7feb55bc61d518c6469f9
欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。Rust 是一门着眼于安全、速度和并发的编程语言。其程序设计兼顾底层语言的性能与控制,并不失高级语言强大的抽象能力。其特性适合那些有类 C 语言经验,正在寻找更安全的替代品的开发者;同样适合有着类 Python 语言背景,寻求在不牺牲表现力的前提下,编写更高性能代码的开发者。
Rust 编译时执行绝大部分的安全检查和内存管理决策对运行时性能的影响微不足道。这使其在其他语言不擅长的应用场景中得以大显身手可预测时间和空间需求的程序嵌入到其他语言中以及编写如设备驱动和操作系统这样的底层代码。Rust 也很擅长 web 程序:它驱动着 Rust 包登记网站package
registry site[crates.io]!我们由衷期待**你**使用 Rust 进行创作。
[crates.io]: https://crates.io/
本书的目标读者至少应了解一门其它编程语言。阅读本书之后,你应该能自如的编写 Rust 程序。我们将通过短小精干、前后呼应的例子来学习 Rust并展示其多样功能的使用方法同时了解它们幕后如何运行。
## 为本书做出贡献
本书是开源的。如果你发现任何错误,不要犹豫,[在 GitHub 上][on GitHub]发起 issue 或提交 pull request。请查看 [CONTRIBUTING.md] 获取更多信息。
[on GitHub]: https://github.com/rust-lang/book
[CONTRIBUTING.md]: https://github.com/rust-lang/book/blob/master/CONTRIBUTING.md
> 译者注:本译本的 [GitHub 仓库][trpl-zh-cn],同样欢迎 Issue 和 PR :)
[trpl-zh-cn]: https://github.com/KaiserY/trpl-zh-cn

@ -2,17 +2,19 @@
> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-01-installation.md)
> <br>
> commit d1448cef370442b51e69298fb734fe29a3d14577
> commit 7480e811ab5ad8d53a5b854d9b0c7a5a4f58499f
第一步是安装 Rust。我们通过 `rustup` 下载 Rust这是一个管理 Rust 版本和相关工具的命令行工具。你需要网络连接来进行下载
第一步是安装 Rust。我们通过 `rustup` 下载 Rust这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网
接下来的步骤会下载最新的稳定stable版 Rust 编译器。本书所有的示例和输出采用稳定版 Rust 1.21.0。Rust 的稳定性确保本书所有的例子在更新版本的 Rust 中能够继续编译。不同版本的输出可能有轻微的不同,因为 Rust 经常改进错误信息和警告。换句话说,任何通过这些步骤所安装的更新稳定版 Rust 预期能够使用本书的内容。
> 注意:如果出于某些理由你倾向于不使用 `rustup`,请到 [Rust 安装页面](https://www.rust-lang.org/install.html) 查看其它安装选项。
接下来的步骤会安装最新的稳定版 Rust 编译器。本书所有示例和输出采用稳定版 Rust 1.21.0。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,通过这些步骤安装的最新稳定版 Rust能正常运行本书中的内容。
> ### 命令行标记
>
> 本章和全书中我们展示了一些使用终端的命令。所有需要输入到终端的行都以 `$` 开头。无需输入`$`;它代表每行命令的起始。很多教程遵循 `$` 代表以常规用户身份运行命令,`#` 代表以管理员身份运行命令的惯例。不以 `$`(或 `#`起始的行通常展示之前命令的输出。另外PowerShell 特定的示例会采用 `>` 而不是 `$`
> 本章和全书中,我们会展示在终端中使用的命令。所有需要输入到终端的行都以 `$` 开头。但无需输入`$`;它代表每行命令的起点。不以 `$` 起始的行通常展示之前命令的输出。另外PowerShell 专用的示例会采用 `>` 而不是 `$`
### 在 Linux 或 macOS 上安装 Rustup
### 在 Linux 或 macOS 上安装 `rustup`
如果你使用 Linux 或 macOS打开终端并输入如下命令
@ -20,15 +22,15 @@
$ curl https://sh.rustup.rs -sSf | sh
```
这个命令下载一个脚本并开始 `rustup` 工具的安装,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功将会出现如下内容
此命令下载一个脚本并开始安装 `rustup` 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功将会出现如下内容
```text
Rust is installed now. Great!
```
当然,如果你不信任采用 `curl URL | sh` 来安装软件,请随意下载、检查和运行这个脚本。
如果你愿意,可在运行前下载并检查该脚本。
此安装脚本自动将 Rust 加入系统 PATH 环境变量中,在下一次登时生效。如果你希望立刻就开始使用 Rust 而不重启终端,在 shell 中运行如下命令手动将 Rust 加入系统 PATH 变量:
此安装脚本自动将 Rust 加入系统 PATH 环境变量中,在下一次登时生效。如果你希望立刻就开始使用 Rust 而不重启终端,在 shell 中运行如下命令手动将 Rust 加入系统 PATH 变量
```text
$ source $HOME/.cargo/env
@ -40,25 +42,20 @@ $ source $HOME/.cargo/env
$ export PATH="$HOME/.cargo/bin:$PATH"
```
另外,你需要一个某种类型的连接器linker。可能他们已经安装了不过当尝试编译 Rust 程序并得到表明连接器无法执行的错误时,你需要自行安装一个。可以安装一个 C 编译器,因为它通常带有正确的连接器。查看对应平台的文档了解如何安装 C 编译器。一些常见的 Rust 包会依赖 C 代码并因此也会需要 C 编译器,所以目前无论如何安装它都是值得的。
另外,你需要一个某种类型的链接器linker。很有可能已经安装不过当你尝试编译 Rust 程序时却有错误指出无法执行链接器这意味着你的系统上没有安装链接器你需要自行安装一个。C 编译器通常带有正确的链接器。请查看你使用平台的文档,了解如何安装 C 编译器。并且,一些常用的 Rust 包依赖 C 代码,也需要安装 C 编译器。因此现在安装一个是值得的。
### 在 Windows 上安装 Rustup
### 在 Windows 上安装 `rustup`
在 Windows 上,前往 [https://www.rust-lang.org/en-US/install.html][install] 并按照其指示安装 Rust。在安装过程的某个步骤你会收到一个信息说明为什么你也需要 Visual Studio 2013 或之后版本的 C++ build tools。获取这些 build tools 最简单的方式是安装 [Build Tools for Visual Studio 2017][visualstudio]。这些工具位于其他工具和框架部分。
在 Windows 上,前往 [https://www.rust-lang.org/install.html][install] 并按照说明安装 Rust。在安装过程的某个步骤你会收到一个信息说明为什么需要安装 Visual Studio 2013 或之后版本的 C++ build tools。获取这些 build tools 最方便的方法是安装 [Build Tools for Visual Studio 2017][visualstudio]。这个工具在 “Other Tools and Frameworks” 部分。
[install]: https://www.rust-lang.org/en-US/install.html
[install]: https://www.rust-lang.org/install.html
[visualstudio]: https://www.visualstudio.com/downloads/
本书的余下部分使用能同时用于 *cmd.exe* 和 PowerShell 的命令。如果出现特定不同情况时,我们会说明如何使用。
### 不使用 Rustup 自定义安装
如果出于某些理由你倾向于不使用 `rustup`,请查看 [Rust 安装页面](https://www.rust-lang.org/install.html) 获取其他选项。
本书的余下部分,使用能同时运行于 *cmd.exe* 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。
### 更新和卸载
通过 `rustup` 安装了 Rust 之后,,更新到最新版本是很简单的。在 shell 中运行如下更新脚本:
通过 `rustup` 安装了 Rust 之后,很容易更新到最新版本。在 shell 中运行如下更新脚本:
```text
$ rustup update
@ -72,33 +69,29 @@ $ rustup self uninstall
### 故障排除Troubleshooting
对于检查是否正确安装了 Rust打开 shell 并运行如下行:
检查是否正确安装了 Rust打开 shell 并运行如下行:
```text
$ rustc --version
```
应该能看到类似这样格式的版本号、提交哈希和提交日期,对应已发布的最新稳定版
你应能看到已发布的最新稳定版的版本号、提交哈希和提交日期,显示为如下格式
```text
rustc x.y.z (abcabcabc yyyy-mm-dd)
```
如果出现这些内容Rust 就安装成功了!如果并没有看到这些信息并且使用 Windows请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。
恭喜入坑!(此处应该有掌声!)
如果在 Windows 中使用出现问题,检查 Rustrustccargo 等)是否在 `%PATH%` 环境变量所包含的路径中。最简单的是 [irc.mozilla.org 上的 #rust IRC 频道][irc]<!-- ignore --> ,可以使用 [Mibbit][mibbit] 来访问它。在这里你可以与其他能够帮助你的 RustaceanRust 用户的称号,有自嘲意味)聊天。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
如果还是不能解决,有许多地方可以求助。最简单的是 [irc.mozilla.org 上的 #rust IRC 频道][irc]<!-- ignore --> ,可以使用 [Mibbit][mibbit] 来访问它。然后就能和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
如果出现这些内容Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [irc.mozilla.org 上的 #rust IRC 频道][irc]<!-- ignore --> ,可以使用 [Mibbit][mibbit] 来访问它。然后就能和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
[irc]: irc://irc.mozilla.org/#rust
[mibbit]: http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust
[users]: https://users.rust-lang.org/
[stackoverflow]: http://stackoverflow.com/questions/tagged/rust
恭喜入坑!(此处应该有掌声!)
### 本地文档
安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 `rustup doc` 在浏览器中查看本地文档。
任何时候,如果你拿不准标准库中的类型或函数如何工作请查看应用程序接口application programming interface API文档
任何时候,如果你拿不准标准库中的类型或函数的用途和用法请查看应用程序接口application programming interfaceAPI文档

@ -2,17 +2,17 @@
> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-02-hello-world.md)
> <br>
> commit d1448cef370442b51e69298fb734fe29a3d14577
> commit 5dfa983aa8fca89f8b70cafe58ab8417491d2018
既然安装好了 Rust我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 “Hello, world!” 是一项传统,这里我们将遵循这个传统!
既然安装好了 Rust我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,这里我们将沿用这个传统!
> 注意本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果相比命令行你更倾向于使用集成开发环境IDE请随意使用合意的 IDE。目前很多 IDE 拥有不同程度的 Rust 支持;查看 IDE 文档了解更多细节。目前 Rust 团队已经致力于提供强大的 IDE 支持,而且进展飞速!
> 注意本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具以及代码位于何处并没有特定的要求如果你更倾向于使用集成开发环境IDE而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 已经不同程度的支持 Rust查看 IDE 文档了解更多细节。最近,Rust 团队已经致力于提供强大的 IDE 支持,而且进展飞速!
### 创建项目目录
首先创建一个存放 Rust 代码的目录开始。Rust 并不关心代码的位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建一个 *projects* 目录,并将你的所有项目置于此处
首先创建一个存放 Rust 代码的目录。Rust 并不关心代码的存放位置,不过对于本书的练习和项目来说,我们建议你在 home 目录中创建 *projects* 目录,并将你的所有项目存放在这里
打开终端并输入如下命令创建一个 *projects* 目录并在 *projects* 目录中为 Hello, world! 创建一个目录。
打开终端并输入如下命令创建 *projects* 目录并在 *projects* 目录中为 Hello, world! 项目创建一个目录。
对于 Linux 和 macOS输入
@ -43,9 +43,9 @@ $ cd hello_world
### 编写并运行 Rust 程序
接下来,新建一个叫做 *main.rs* 的源文件。Rust 源代码总是以 *.rs* 后缀结尾。如果文件名包含多个单词,使用下划线分隔它们。例如 *my_program.rs*,而不是 *myprogram.rs*。
接下来,新建一个源文件,命名为 *main.rs*。Rust 源文件总是以 *.rs* 扩展名结尾。如果文件名包含多个单词,使用下划线分隔它们。例如命名为 *hello_world.rs*,而不是 *helloworld.rs*。
现在打开刚创建的 *main.rs* 文件,输入如示例 1-1 所示的代码。
现在打开刚创建的 *main.rs* 文件,输入示例 1-1 中的代码。
<span class="filename">文件名: main.rs</span>
@ -55,9 +55,9 @@ fn main() {
}
```
<span class="caption">示例 1-1: 一个打印 “Hello, world!” 的程序</span>
<span class="caption">示例 1-1: 一个打印 `Hello, world!` 的程序</span>
保存文件,并回到终端窗口。在 Linux 或 macOS 上,输入如下命令编译并运行文件:
保存文件,并回到终端窗口。在 Linux 或 macOS 上,输入如下命令编译并运行文件:
```text
$ rustc main.rs
@ -65,7 +65,7 @@ $ ./main
Hello, world!
```
在 Windows 上,输入命令 `.\main.exe` 而不是 `./main`
在 Windows 上,输入命令 `.\main.exe`,而不是 `./main`
```powershell
> rustc main.rs
@ -73,13 +73,13 @@ Hello, world!
Hello, world!
```
不管使用何种系统,字符串 `Hello, world!` 应该打印到终端。如果没有看到这些输出,回到 “故障排除” 部分查找寻求帮助的方
不管使用何种操作系统,终端应该打印字符串 `Hello, world!`。如果没有看到这些输出,回到 “故障排除” 部分查找寻求帮助的方
如果 `Hello, world!` 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为了一名 Rust 程序员!欢迎!
如果 `Hello, world!` 出现了,恭喜你!你已经正式编写了一个 Rust 程序。现在你成为一名 Rust 程序员,欢迎!
### 分析 Rust 程序
现在,让我们回过头来仔细看看 Hello, world! 程序中到底发生了什么。这是拼图的第一片
现在,让我们回过头来仔细看看 Hello, world! 程序中到底发生了什么。这是第一块拼图:
```rust
fn main() {
@ -87,11 +87,11 @@ fn main() {
}
```
这几行定义了一个 Rust **函数**。`main` 函数是特殊的:它是每个可执行的 Rust 程序所首先执行的代码。第一行代码声明了一个叫做 `main` 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在括号中,位于 `(` 和 `)` 之间
这几行定义了一个 Rust 函数。`main` 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 `main` 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在括号中,`()`。
还须注意函数体被包裹在花括号中,`{` 和 `}` 之间。Rust 要求所有函数体都要用花括号包裹起来(译者注:有些语言,当函数体只有一行时可以省略花括号,但在 Rust 中是不行的)。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
还须注意函数体被包裹在花括号中,`{}`。Rust 要求所有函数体都要用花括号包裹起来(译者注:有些语言,当函数体只有一行时可以省略花括号,但在 Rust 中是不行的)。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
在编写本书的时候,一个叫做 `rustfmt` 的自动格式化工具正在开发中。如果你希望在 Rust 项目中保持一种标准风格,`rustfmt` 会将代码格式化为特定的风格。Rust 团队计划最终将包含在标准 Rust 发行版中,就像 `rustc`。所以根据你阅读本书的时间,它可能已经安装到你的电脑中了!检查在线文档以了解更多细节。
在编写本书的时候,一个叫做 `rustfmt` 的自动格式化工具正在开发中。如果你希望在 Rust 项目中保持一种标准风格,`rustfmt` 会将代码格式化为特定的风格。Rust 团队计划最终将该工具包含在标准 Rust 发行版中,就像 `rustc`。所以根据你阅读本书的时间,它可能已经安装到你的电脑中了!检查在线文档以了解更多细节。
`main()` 函数中是如下代码:
@ -99,27 +99,27 @@ fn main() {
println!("Hello, world!");
```
这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 使用 4 个空格的缩进风格,而不是 1 个制表符tab
这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符tab
第二,`println!` 调用了一个 Rust *****macro*)。如果是调用函数,则应输入 `println`(没有`!`)。我们将在附录 D 中更加详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数。
第二,`println!` 调用了一个 Rust 宏macro。如果是调用函数则应输入 `println`(没有`!`)。我们将在附录 D 中详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数。
第三,`"Hello, world!"` 是一个 **字符串**。我们把这个字符串作为一个参数传递给 `println!`,字符串将被打印到屏幕上。
第三,`"Hello, world!"` 是一个字符串。我们把这个字符串作为一个参数传递给 `println!`,字符串将被打印到屏幕上。
第四,该行以分号结尾(`;`),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以 `;` 结尾。
第四,该行以分号结尾(`;`),这代表一个表达式的结束和下一个表达式的开始。大部分 Rust 代码行以分号结尾。
### 编译和运行是彼此独立的步骤
你刚刚运行了一个新创建的程序,那么让我们检查过程中的每一个步骤。
你刚刚运行了一个新创建的程序,那么让我们检查过程中的每一个步骤。
在运行 Rust 程序之前,必须先通过 `rustc` 命令并传递源文件名称来使用 Rust 编译器来编译它,如下:
在运行 Rust 程序之前,必须先使用 Rust 编辑器编译它,即输入 `rustc` 命令并传入源文件名称,如下:
```text
$ rustc main.rs
```
如果你有 C 或 C++ 背景,就会发现这与 `gcc``clang` 类似。编译成功后Rust 应该会输出一个二进制可执行文件。
如果你有 C 或 C++ 背景,就会发现这与 `gcc``clang` 类似。编译成功后Rust 会输出一个二进制可执行文件。
在 Linux、macOS 或 Windows的 PowerShell 上在 shell 中可以通过 `ls` 命令看到如下内容
在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令就可看见这个可执行文件,如下
```text
$ ls
@ -135,14 +135,14 @@ main.pdb
main.rs
```
这展示了 *.rs* 后缀的源文件、可执行文件(在 Windows下是 *main.exe*,其它平台是 *main*),以及当使用 CMD 时会有一个包含调试信息*.pdb* 后缀的文件。从这里开始运行 *main**main.exe* 文件,如下:
这展示了扩展名为 *.rs* 的源文件、可执行文件(在 Windows 下是 *main.exe*,其它平台是 *main*),以及当使用 CMD 时会有一个包含调试信息、扩展名为 *.pdb* 的文件。从这里开始运行 *main**main.exe* 文件,如下:
```text
$ ./main # or .\main.exe on Windows
```
如果 *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。不过在这些语言中只需要一句命令就可以编译和行程序。这一切都是语言设计上的权衡取舍。
如果你更熟悉动态语言,如 Ruby、Python 或 JavaScript则可能不习惯将编译和运行分为两个单独的步骤。Rust 是一种 **预编译静态类型***ahead-of-time compiled*)语言,这意味着你可以编译程序,并将可执行文件送给其他人,他们甚至不需要安装 Rust 就可以运行。如果你给他人一个 *.rb*、*.py* 或 *.js* 文件,他们需要先分别安装 RubyPythonJavaScript 实现运行时环境VM。不过在这些语言中只需要一句命令就可以编译和行程序。这一切都是语言设计上的权衡取舍。
仅仅使用 `rustc` 编译简单程序是没问题的,不过随着项目的增长,你可能需要控制你项目的方方面面,并且更容易地将代码分享给其它人或项目。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。
仅仅使用 `rustc` 编译简单程序是没问题的,不过随着项目的增长,你可能需要管理你项目的方方面面,并让代码易于分享。接下来,我们要介绍一个叫做 Cargo 的工具,它会帮助你编写真实世界中的 Rust 程序。

@ -2,38 +2,36 @@
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-03-hello-cargo.md)
> <br>
> commit d1448cef370442b51e69298fb734fe29a3d14577
> commit 7480e811ab5ad8d53a5b854d9b0c7a5a4f58499f
Cargo 是 Rust 的构建系统和包管理器。大部分 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖***dependencies*)。
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖***dependencies*)。
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 Hello, world! 项目,将只会用到 Cargo 构建代码那部分功能。随着编写的程序更加复杂,你会添加依赖,如果你一开始就使用 Cargo 的话,添加依赖将会变得简单许多。
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 Hello, world! 项目,将只会用到 Cargo 构建代码那部分功能。随着编写的 Rust 程序更加复杂,你会添加依赖,如果你一开始就使用 Cargo 的话,添加依赖将会变得简单许多。
由于绝大部分 Rust 项目使用 Cargo本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话可以在终端输入如下命令检查是否安装了 Cargo
由于绝大多数 Rust 项目使用 Cargo本书接下来的部分假设你也使用 Cargo。如果使用 “安装” 章节介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话可以在终端输入如下命令检查是否安装了 Cargo
```text
$ cargo --version
```
如果出现了版本号,一切 OK如果出现类似 `command not found` 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。
如果你看到了版本号,说明已安装!如果看到类似 `command not found` 的错误,你应该查看相应安装文档以确定如何单独安装 Cargo。
### 使用 Cargo 创建项目
让我们使用 Cargo 来创建一个新项目,然后看看与上面的 `hello_world` 项目有什么不同。回到 projects 目录(或者任何你放置代码的目录)。接着并在任何操作系统下运行
我们使用 Cargo 创建一个新项目,然后看看与上面的 Hello, world! 项目有什么不同。回到 *projects* 目录(或者你存放代码的目录)。接着,可在任何操作系统下运行以下命令
```text
$ cargo new hello_cargo --bin
$ cd hello_cargo
```
第一行命令新建了名为 *hello_cargo* 的二进制可执行程序。传递给 `cargo new``--bin` 参数生成一个可执行程序(通常就叫做 **二进制文件***binary*),而不是一个库。项目的名称被定`hello_cargo`,同时 Cargo 在一个同名目录中创建项目文件。
第一行命令新建了名为 *hello_cargo* 的二进制可执行程序。`cargo new` 传入 `--bin` 参数会生成一个可执行程序(通常就叫做 **二进制文件***binary*),而不是一个库。项目被命名`hello_cargo`,同时 Cargo 在一个同名目录中创建项目文件。
进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件和一个 *src* 目录,*main.rs* 文件位于 *src* 目录中。它也在 *hello_cargo* 目录初始化了一个 git 仓库,以及一个 *.gitignore* 文件。
进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中 *main.rs* 文件。它也在 *hello_cargo* 目录初始化了一个 git 仓库,以及一个 *.gitignore* 文件。
> 注意Git 是一个常版本控制系统version control system VCS。可以通过 `--vcs` 参数使 `cargo new` 切换到其它版本控制系统VCS或者不使用 VCS。运行 `cargo new --help` 参看可用的选项。
> 注意Git 是一个常用的版本控制系统version control system VCS。可以通过 `--vcs` 参数使 `cargo new` 切换到其它版本控制系统VCS或者不使用 VCS。运行 `cargo new --help` 参看可用的选项。
如果列出 *hello_cargo* 目录中的文件,将会看到 Cargo 生成了一个文件和一个目录:一个 *Cargo.toml* 文件和一个 *src* 目录,*main.rs* 文件位于 *src* 目录中。它也在 *hello_cargo* 目录初始化了一个 git 仓库,以及一个 *.gitignore* 文件;你可以通过 `--vcs` 参数切换到其它版本控制系统VCS或者不使用 VCS。
请随意使用任何文本编辑器打开 *Cargo.toml* 文件。它应该看起来如示例 1-2 所示:
请选用文本编辑器打开 *Cargo.toml* 文件。它应该看起来如示例 1-2 所示:
<span class="filename">文件名: Cargo.toml</span>
@ -46,17 +44,17 @@ authors = ["Your Name <you@example.com>"]
[dependencies]
```
<span class="caption">示例 1-2: *Cargo.toml* 生成的 *Cargo.toml* 的内容</span>
<span class="caption">示例 1-2: *cargo new* 命令生成的 *Cargo.toml* 的内容</span>
这个文件使用 [*TOML*][toml]<!-- ignore --> (Tom's Obvious, Minimal Language) 格式,这是 Cargo 配置文件的格式。
这个文件使用 [*TOML*][toml]<!-- ignore --> (*Tom's Obvious, Minimal Language*) 格式,这是 Cargo 配置文件的格式。
[toml]: https://github.com/toml-lang/toml
第一行,`[package]`,是一个部分标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他部分
第一行,`[package]`,是一个片段section标题,表明下面的语句用来配置一个包。随着我们在这个文件增加更多的信息,还将增加其他片段section
接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、版本和作者,它们告诉 Cargo 需要编译这个项目。Cargo 从环境中获取你的名称和 email 信息,所以如果这些信息不正确,请修改并保存此文件。
接下来的三行设置了 Cargo 编译程序所需的配置:项目的名称、版本和作者。Cargo 从环境中获取你的名字和 email 信息,所以如果这些信息不正确,请修改并保存此文件。
最后一行,`[dependencies]`,是项目依赖列表(我们称呼 Rust 代码包为 crate部分的开始。在 Rust 中,代码包被称为 *crates*。这个项目并不需要任何其他的 crate不过在第二章的第一个项目会用到依赖那时会用得上这个部分
最后一行,`[dependencies]`,是罗列项目依赖的片段。在 Rust 中,代码包被称为 *crates*。这个项目并不需要其他的 crate不过在第二章的第一个项目会用到依赖那时会用得上这个片段
现在打开 *src/main.rs* 看看:
@ -68,15 +66,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 期望源文件存放在 *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
@ -84,16 +82,16 @@ $ cargo build
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs
```
这个命令会创建 *target/debug/hello_cargo*或者在 Windows 上是 *target\debug\hello_cargo.exe*可执行文件,而不是在目前目录。可以通过这个命令运行可执行文件:
这个命令会创建一个可执行文件 *target/debug/hello_cargo* (在 Windows 上是 *target\debug\hello_cargo.exe*),而不是在目前目录。可以通过这个命令运行可执行文件:
```text
$ ./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
Hello, world!
```
如果一切顺利,`Hello, world!` 应该打印在终端上。首次运行 `cargo build`也会使 Cargo 在项目根目录创建一个新文件:*Cargo.lock*。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。
如果一切顺利,终端上应该会打印出 `Hello, world!`。首次运行 `cargo build` 时,也会使 Cargo 在项目根目录创建一个新文件:*Cargo.lock*。这个文件记录项目依赖的实际版本。这个项目并没有依赖,所以其内容比较少。你自己永远也不需要碰这个文件,让 Cargo 处理它就行了。
我们刚刚使用 `cargo build` 构建了项目并使用 `./target/debug/hello_cargo` 运行了程序,也可以使用 `cargo run` 在一个命令中同时编译并运行生成的可执行文件:
我们刚刚使用 `cargo build` 构建了项目并使用 `./target/debug/hello_cargo` 运行了程序,也可以使用 `cargo run` 在一个命令中同时编译并运行生成的可执行文件:
```text
$ cargo run
@ -111,7 +109,7 @@ $ cargo run
Running `target/debug/hello_cargo`
Hello, world!
```
Cargo 还提供了一个叫 `cargo check` 的命令。该命令快速检查代码确保其可以编译但并不产生可执行文件:
Cargo 还提供了一个叫 `cargo check` 的命令。该命令快速检查代码确保其可以编译但并不产生可执行文件:
```text
$ cargo check
@ -119,25 +117,25 @@ $ cargo check
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
```
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build`快得多,因为它省略了生成可执行文件的步骤。如果编写代码时持续的进行检查,`cargo check` 会加速开发!为此很多 Rustaceans 编写代码时运行 `cargo check` 定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时运行 `cargo build`
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build` 快得多,因为它省略了生成可执行文件的步骤。如果编写代码时持续的进行检查,`cargo check` 会加速开发!为此很多 Rustaceans 编写代码时定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时运行 `cargo build`
作为目前所学的关于 Cargo 内容的回顾
我们回顾下已学习的 Cargo 内容
* 可以使用 `cargo build``cargo check` 构建项目。
* 可以使用 `cargo run` 一步构建并运行项目。
* 有别于将构建结果放在与源码相同的目录Cargo 会将其放到 *target/debug* 目录。
Cargo 的一个额外的优点是不管你使用什么操作系统其命令都是一样的。所以从此以后本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。
使用 Cargo 的一个额外的优点是不管你使用什么操作系统其命令都是一样的。所以从此以后本书将不再为 Linux 和 macOS 以及 Windows 提供相应的命令。
### 发布release构建
当项目最终准备好发布,可以使用 `cargo build --release` 来优化编译项目。这会在 *target/release* 而不是 *target/debug* 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种为了开发,你需要经常快速重新构建;另一种为了构建给用户最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 `cargo build --release` 并使用 *target/release* 下的可执行文件进行测试。
当项目最终准备好发布,可以使用 `cargo build --release` 来优化编译项目。这会在 *target/release* 而不是 *target/debug* 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 `cargo build --release` 并使用 *target/release* 下的可执行文件进行测试。
### 把 Cargo 当作习惯
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入终将证明其价值。对于拥有多个 crate 的复杂项目, Cargo 来协调构建将简单的多。
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入终将证明其价值。对于拥有多个 crate 的复杂项目,交给 Cargo 来协调构建将简单的多。
即便 `hello_cargo` 项目十分简单,它现在也使用了很多你之后的 Rust 生涯将会用得上的实用工具。其实对于任何你想要从事的项目,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:
即便 `hello_cargo` 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:
```text
$ git clone someurl.com/someproject
@ -151,12 +149,12 @@ $ cargo build
## 总结
你已经准备好迎来 Rust 之旅的伟大开始!在本章中,你学习了如何:
你已经踏上了 Rust 之旅!在本章中,你学习了如何:
* 使用 `rustup` 安装最新稳定版的 Rust
* 更新到新版的 Rust
* 打开本地安装的文档
* 直接通过 `rustc` 编写并运行 Hello, world! 程序
* 使用 Cargo 风格创建并运行新项目
* 直接通过 `rustc` 编写并运行 Hello, world! 程序
* 使用 Cargo 创建并运行新项目
现在是一个通过构建更大的项目来熟悉读写 Rust 代码的好时机。所以在下一章,我们会构建一个猜猜看游戏程序。如果你更愿意开始学习 Rust 中常见的编程概念如何工作,请阅读第三章,接着再回到第二章。
是时候通过构建更真实的程序来熟悉读写 Rust 代码了。所以在下一章,我们会构建一个猜猜看游戏程序。如果你更愿意从学习 Rust 常用的编程概念开始,请阅读第三章,接着再回到第二章。

@ -1,13 +1,13 @@
# 常见编程概念
# 通用编程概念
> [ch03-00-common-programming-concepts.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch03-00-common-programming-concepts.md)
> <br>
> commit 04aa3a45eb72855b34213703718f50a12a3eeec8
> commit b64de01431cdf1020ad3358d2f83e46af68a39ed
本章涉及一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 环境中讨论它们,解释它们的使用习惯
本章介绍一些几乎所有编程语言都有的概念,以及它们在 Rust 中是如何工作的。很多编程语言的核心概念都是共通的,本章中展示的概念都不是 Rust 所特有的,不过我们会在 Rust 上下文中讨论它们,并解释使用这些概念的惯例
具体地,我们将会学习变量,基本类型,函数,注释和控制流。这些基础知识将会出现在每一个 Rust 程序中,提早学习这些概念会为你奠定坚实的起步基础。
具体来说,我们将会学习变量、基本类型、函数、注释和控制流。每一个 Rust 程序中都会用到这些基础知识,提早学习这些概念会让你在起步时就打下坚实的基础。
> ### 关键字
>
> Rust 语言有一系列保留的 **关键字***keywords*),就像大部分语言一样,它们只能由语言本身使用,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,并被用来完成 Rust 程序中的各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在附录 A 中找到关键字的列表。
> Rust 语言有一保留的 **关键字***keywords*),就像大部分语言一样,它们只能由语言本身使用。记住,你不能使用这些关键字作为变量或函数的名称。大部分关键字有特殊的意义,你将在你的 Rust 程序中使用它们完成各种任务;一些关键字目前没有相应的功能,是为将来可能添加的功能保留的。可以在附录 A 中找到关键字的列表。

Loading…
Cancel
Save