Merge pull request #621 from Sefank/main

Update ch01
pull/622/head
KaiserY 2 years ago committed by GitHub
commit 860f99a134
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,26 +1,24 @@
## 安装
> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/main/src/ch01-01-installation.md) <br>
> commit aa6f28089364b148bbc6baddd59a2625dcc4dfba
> commit 1e17bf15b12f6f7b8d1711dbd343ef8993f64baa
第一步是安装 Rust。我们会通过 `rustup` 下载 Rust这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。
> 注意:如果你出于某些理由倾向于不使用 `rustup`,请到 [Rust 的其他安装方法页面][otherinstall] 查看其它安装选项。
[otherinstall]: https://forge.rust-lang.org/infra/other-installation-methods.html
接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust都应该能正常运行本书中的内容。
> ### 命令行标记
>
> 本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 `$` 开头。但无需输入`$`;它代表每行命令的起点。不以 `$` 起始的行通常展示前命令的输出。另外PowerShell 专用的示例会采用 `>` 而不是 `$`
> 本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 `$` 开头。你不需要输入`$`字符;这里显示的`$`字符表示命令行提示符,仅用于提示每行命令的起点。不以 `$` 起始的行通常展示前一个命令的输出。另外PowerShell 专用的示例会采用 `>` 而不是 `$`
### 在 Linux 或 macOS 上安装 `rustup`
如果你使用 Linux 或 macOS打开终端并输入如下命令
```console
$ curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh
$ curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
```
此命令下载一个脚本并开始安装 `rustup` 工具,这会安装最新稳定版 Rust。过程中可能会提示你输入密码。如果安装成功将会出现如下内容
@ -29,7 +27,7 @@ $ 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 语言编译器:
@ -41,51 +39,79 @@ Linux 用户通常需要根据发行版distribution文档安装 GCC 或 Cl
### 在 Windows 上安装 `rustup`
在 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]。当被问及需要安装什么的时候请确保选择 ”C++ build tools“并确保包括了 Windows 10 SDK 和英文语言包English language pack组件。
在 Windows 上,前往 [https://www.rust-lang.org/install.html][install] 并按照说明安装 Rust。在安装过程的某个步骤你会收到一个信息说明为什么需要安装 Visual Studio 2013 或其更新版本的 MSVC 构建工具。要获取构建工具,你需要安装 [Visual Studio 2022][visualstudio]。当被问及需要安装什么工作负载Workload的时候请确保勾选了以下内容
[install]: https://www.rust-lang.org/tools/install
[visualstudio]: https://visualstudio.microsoft.com/visual-cpp-build-tools/
- “使用 C++ 的桌面开发”,
- Windows 10 (或 11 SDK
- 英语语言包,以及其他你所需要的语言包。
本书的余下部分会使用能同时运行于 *cmd.exe* 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。
### 更新和卸载
### 检查安装是否正确Troubleshooting
通过 `rustup` 安装了 Rust 之后,很容易更新到最新版本。在 shell 中运行如下更新脚本
要检查是否正确安装了 Rust打开命令行并输入
```console
$ rustup update
$ rustc --version
```
为了卸载 Rust 和 `rustup`,在 shell 中运行如下卸载脚本:
你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期:
```console
$ rustup self uninstall
```text
rustc x.y.z (abcabcabc yyyy-mm-dd)
```
### 故障排除Troubleshooting
如果看到了这样的信息,就说明 Rust 已经安装成功了!
> 译者:恭喜入坑!(此处应该有掌声!)
如果没看到,请按照下面说明的方法检查 Rust 是否在您的 `%PATH%` 系统变量中。
要检查是否正确安装了 Rust打开 shell 并运行如下行:
在 Windows CMD 中,请使用命令
```console
$ rustc --version
> echo %PATH%
```
你应能看到已发布的最新稳定版的版本号、提交哈希和提交日期,显示为如下格式
在 PowerShell 中,请使用命令
```text
rustc x.y.z (abcabcabc yyyy-mm-dd)
```console
> echo $env:Path
```
如果出现这些内容Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
在 Linux 和 macOS 中,请使用命令:
[discord]: https://discord.gg/rust-lang
[users]: https://users.rust-lang.org/
[stackoverflow]: https://stackoverflow.com/questions/tagged/rust
```console
echo $PATH
```
> 译者:恭喜入坑!(此处应该有掌声!)
如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是[位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 RustaceanRust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
> 译者注:这些资源的主要语言都是英语。
## 更新与卸载
通过 `rustup` 安装了 Rust 之后,很容易更新到最新版本,只需要在命令行中运行如下更新脚本即可:
```console
$ rustup update
```
若要卸载 Rust 和 `rustup`,请在命令行中运行如下卸载脚本:
```console
$ rustup self uninstall
```
### 本地文档
安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 `rustup doc` 在浏览器中查看本地文档。
任何时候如果你拿不准标准库中的类型或函数的用途和用法请查阅应用程序接口application programming interfaceAPI文档
[otherinstall]: https://forge.rust-lang.org/infra/other-installation-methods.html
[install]: https://www.rust-lang.org/tools/install
[visualstudio]: https://visualstudio.microsoft.com/downloads/
[discord]: https://discord.gg/rust-lang
[users]: https://users.rust-lang.org/
[stackoverflow]: https://stackoverflow.com/questions/tagged/rust

@ -2,11 +2,11 @@
> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/main/src/ch01-02-hello-world.md)
> <br>
> commit 9c0fa2714859738ff73cbbb829592e4c037d7e46
> commit 3709acaf30b7e8e520c53e02aa8081f33f4a4c17
既然安装好了 Rust我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,我们将沿用这一传统!
> 注意本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具以及代码位于何处并没有特定的要求如果你更倾向于使用集成开发环境IDE而不是命令行请尽管使用你喜欢的 IDE。目前很多 IDE 已经不同程度的支持 Rust查看 IDE 文档了解更多细节。最近Rust 团队已经致力于提供强大的 IDE 支持,而且进展飞速!
> 注意本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具以及代码位于何处并没有特定的要求如果你更倾向于使用集成开发环境IDE而不是命令行请尽管使用你喜欢的 IDE。目前很多 IDE 都在一定程度上支持 Rust查看 IDE 文档以了解更多细节。Rust 团队一直致力于借助 `rust-analyzer` 提供强大的 IDE 支持。详见[附录 D][devtools]<!-- ignore -->
### 创建项目目录
@ -34,7 +34,7 @@ $ cd hello_world
### 编写并运行 Rust 程序
接下来,新建一个源文件,命名为 *main.rs*。Rust 源文件总是以 *.rs* 扩展名结尾。如果文件名包含多个单词,使用下划线分隔它们。例如命名为 *hello_world.rs*,而不是 *helloworld.rs*
接下来,新建一个源文件,命名为 *main.rs*。Rust 源文件总是以 *.rs* 扩展名结尾。如果文件名包含多个单词,那么按照命名习惯,应当使用下划线来分隔单词。例如命名为 *hello_world.rs*,而不是 *helloworld.rs*
现在打开刚创建的 *main.rs* 文件,输入示例 1-1 中的代码。
@ -48,7 +48,7 @@ fn main() {
<span class="caption">示例 1-1: 一个打印 `Hello, world!` 的程序</span>
保存文件,并回到终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件:
保存文件,并回到当前目录为“~/projects/hello_world”的终端窗口。在 Linux 或 macOS 上,输入如下命令,编译并运行文件:
```console
$ rustc main.rs
@ -70,7 +70,7 @@ Hello, world!
### 分析这个 Rust 程序
现在,让我们回过头来仔细看看 “Hello, world!” 程序中到底发生了什么。这是第一块拼图:
现在,让我们回过头来仔细看看这个 “Hello, world!” 程序。这是第一块拼图:
```rust
fn main() {
@ -78,13 +78,13 @@ fn main() {
}
```
这几行定义了一个 Rust 函数。`main` 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 `main` 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号中,`()`
这几行定义了一个名叫 `main`函数。`main` 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 `main` 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号 `()`
还须注意,函数体被包裹在花括号中,`{}`。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
函数体被包裹在 `{}`。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 `rustfmt` 的自动格式化工具将代码格式化为特定的风格。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 `rustc`。所以它应该已经安装在你的电脑中了!检查在线文档以了解更多细节。
> 注:如果你希望在 Rust 项目中保持一种标准风格,可以使用名为 `rustfmt` 的自动格式化工具将代码格式化为特定的风格(更多内容详见[附录 D][devtools] 中的 `rustfmt`<!-- ignore -->。Rust 团队已经在标准的 Rust 发行版中包含了这个工具,就像 `rustc` 一样。所以它应该已经安装在你的电脑中了!
`main()` 函数中是如下代码:
`main` 函数中有如下代码:
```rust
println!("Hello, world!");
@ -132,10 +132,11 @@ 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
[devtools]: appendix-04-useful-development-tools.md

@ -2,11 +2,11 @@
> [ch01-03-hello-cargo.md](https://github.com/rust-lang/book/blob/main/src/ch01-03-hello-cargo.md)
> <br>
> commit bcab8b5f5f520a40985783082d99fbe841adf649
> commit 1e17bf15b12f6f7b8d1711dbd343ef8993f64baa
Cargo 是 Rust 的构建系统和包管理器。大多数 Rustacean 们使用 Cargo 来管理他们的 Rust 项目,因为它可以为你处理很多任务,比如构建代码、下载依赖库并编译这些库。(我们把代码所需要的库叫做 **依赖***dependencies*))。
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。所以如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
最简单的 Rust 程序,比如我们刚刚编写的,没有任何依赖。如果使用 Cargo 来构建 “Hello, world!” 项目,将只会用到 Cargo 构建代码的那部分功能。在编写更复杂的 Rust 程序时,你将添加依赖项,如果使用 Cargo 启动项目,则添加依赖项将更容易。
由于绝大多数 Rust 项目使用 Cargo本书接下来的部分假设你也使用 Cargo。如果使用 [“安装”][installation] 部分介绍的官方安装包的话,则自带了 Cargo。如果通过其他方式安装的话可以在终端输入如下命令检查是否安装了 Cargo
@ -25,7 +25,7 @@ $ cargo new hello_cargo
$ cd hello_cargo
```
第一行命令新建了名为 *hello_cargo* 的目录。我们将项目命名为 *hello_cargo*,同时 Cargo 在一个同名目录中创建项目文件。
第一行命令新建了名为 *hello_cargo* 的目录和项目。我们将项目命名为 *hello_cargo*,同时 Cargo 在一个同名目录中创建项目文件。
进入 *hello_cargo* 目录并列出文件。将会看到 Cargo 生成了两个文件和一个目录:一个 *Cargo.toml* 文件,一个 *src* 目录,以及位于 *src* 目录中的 *main.rs* 文件。
@ -68,7 +68,7 @@ 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 帮助你保持项目干净整洁,一切井井有条。
@ -84,7 +84,7 @@ $ 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*),而不是放在目前目录下。由于默认的构建方法是调试构建debug buildCargo 会将可执行文件放在名为 *debug* 的目录中。可以通过这个命令运行可执行文件:
```console
$ ./target/debug/hello_cargo # 或者在 Windows 下为 .\target\debug\hello_cargo.exe
@ -102,7 +102,9 @@ $ cargo run
Hello, world!
```
注意这一次并没有出现表明 Cargo 正在编译 `hello_cargo` 的输出。Cargo 发现文件并没有被改变就直接运行了二进制文件。如果修改了源文件的话Cargo 会在运行之前重新构建项目,并会出现像这样的输出:
比起要记得运行 `cargo build` 之后再用可执行文件的完整路径来运行程序,使用 `cargo run` 可以实现完全相同的效果,而且要方便得多,所以大多数开发者会使用 `cargo run`
注意这一次并没有出现表明 Cargo 正在编译 `hello_cargo` 的输出。Cargo 发现文件并没有被改变所以它并没有重新编译而是直接运行了可执行文件。如果修改了源文件的话Cargo 会在运行之前重新构建项目,并会出现像这样的输出:
```console
$ cargo run
@ -120,10 +122,11 @@ $ cargo check
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
```
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build` 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,`cargo check` 会加速开发!为此很多 Rustaceans 编写代码时定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时才运行 `cargo build`
为什么你会不需要可执行文件呢?通常 `cargo check` 要比 `cargo build` 快得多,因为它省略了生成可执行文件的步骤。如果你在编写代码时持续的进行检查,`cargo check` 可以让你快速了解现在的代码能不能正常通过编译!为此很多 Rustaceans 编写代码时定期运行 `cargo check` 确保它们可以编译。当准备好使用可执行文件时才运行 `cargo build`
我们回顾下已学习的 Cargo 内容:
* 可以使用 `cargo new` 创建项目。
* 可以使用 `cargo build` 构建项目。
* 可以使用 `cargo run` 一步构建并运行项目。
* 可以使用 `cargo check` 在不生成二进制文件的情况下构建项目来检查错误。
@ -137,7 +140,7 @@ $ cargo check
### 把 Cargo 当作习惯
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入,终将证明其价值。对于拥有多个 crate 的复杂项目,交给 Cargo 来协调构建将简单的多。
对于简单项目, Cargo 并不比 `rustc` 提供了更多的优势,不过随着开发的深入,终将证明其价值。一旦程序壮大到由多个文件组成,亦或者是需要其他的依赖,让 Cargo 协调构建过程就会简单得多。
即便 `hello_cargo` 项目十分简单,它现在也使用了很多在你之后的 Rust 生涯将会用到的实用工具。其实,要在任何已存在的项目上工作时,可以使用如下命令通过 Git 检出代码,移动到该项目目录并构建:

Loading…
Cancel
Save