mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2025-04-06 11:48:03 +08:00
commit
860f99a134
@ -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 中运行如下更新脚本:
|
||||
|
||||
```console
|
||||
$ rustup update
|
||||
```
|
||||
|
||||
为了卸载 Rust 和 `rustup`,在 shell 中运行如下卸载脚本:
|
||||
|
||||
```console
|
||||
$ rustup self uninstall
|
||||
```
|
||||
|
||||
### 故障排除(Troubleshooting)
|
||||
|
||||
要检查是否正确安装了 Rust,打开 shell 并运行如下行:
|
||||
要检查是否正确安装了 Rust,打开命令行并输入:
|
||||
|
||||
```console
|
||||
$ rustc --version
|
||||
```
|
||||
|
||||
你应能看到已发布的最新稳定版的版本号、提交哈希和提交日期,显示为如下格式:
|
||||
你应该可以看到按照以下格式显示的最新稳定版本的版本号、对应的 Commit Hash 和 Commit 日期:
|
||||
|
||||
```text
|
||||
rustc x.y.z (abcabcabc yyyy-mm-dd)
|
||||
```
|
||||
|
||||
如果出现这些内容,Rust 就安装成功了!如果并没有看到这些信息,并且使用的是 Windows,请检查 Rust 是否位于 `%PATH%` 系统变量中。如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是 [位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 Rustacean(Rust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
|
||||
|
||||
[discord]: https://discord.gg/rust-lang
|
||||
[users]: https://users.rust-lang.org/
|
||||
[stackoverflow]: https://stackoverflow.com/questions/tagged/rust
|
||||
如果看到了这样的信息,就说明 Rust 已经安装成功了!
|
||||
|
||||
> 译者:恭喜入坑!(此处应该有掌声!)
|
||||
|
||||
如果没看到,请按照下面说明的方法检查 Rust 是否在您的 `%PATH%` 系统变量中。
|
||||
|
||||
在 Windows CMD 中,请使用命令:
|
||||
|
||||
```console
|
||||
> echo %PATH%
|
||||
```
|
||||
|
||||
在 PowerShell 中,请使用命令:
|
||||
|
||||
```console
|
||||
> echo $env:Path
|
||||
```
|
||||
|
||||
在 Linux 和 macOS 中,请使用命令:
|
||||
|
||||
```console
|
||||
echo $PATH
|
||||
```
|
||||
|
||||
如果一切正确但 Rust 仍不能使用,有许多地方可以求助。最简单的是[位于 Rust 官方 Discord][discord] 上的 #beginners 频道。在这里你可以和其他 Rustacean(Rust 用户的称号,有自嘲意味)聊天并寻求帮助。其它给力的资源包括[用户论坛][users]和 [Stack Overflow][stackoverflow]。
|
||||
|
||||
> 译者注:这些资源的主要语言都是英语。
|
||||
|
||||
## 更新与卸载
|
||||
|
||||
通过 `rustup` 安装了 Rust 之后,很容易更新到最新版本,只需要在命令行中运行如下更新脚本即可:
|
||||
|
||||
```console
|
||||
$ rustup update
|
||||
```
|
||||
|
||||
若要卸载 Rust 和 `rustup`,请在命令行中运行如下卸载脚本:
|
||||
|
||||
```console
|
||||
$ rustup self uninstall
|
||||
```
|
||||
|
||||
### 本地文档
|
||||
|
||||
安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 `rustup doc` 在浏览器中查看本地文档。
|
||||
|
||||
任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!
|
||||
|
||||
[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* 文件,他们需要先分别安装 Ruby,Python,JavaScript 实现(运行时环境,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 build),Cargo 会将可执行文件放在名为 *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…
Reference in New Issue
Block a user