mirror of
https://github.com/gnu4cn/rust-lang-zh_CN.git
synced 2025-03-14 03:10:44 +08:00
Update Ch21
This commit is contained in:
parent
41d85c7a74
commit
5d9971bf50
@ -7,7 +7,7 @@
|
||||
- Rust 的包管理器和构建系统 Cargo 的使用。
|
||||
|
||||
|
||||
## <a id="installation"></a>安装
|
||||
## <a id="installation"></a> 安装
|
||||
|
||||
第一步即是安装 Rust。这里将通过 `rustup` 这个用于管理 Rust 版本及相关工具的命令行工具,来下载 Rust。要下载 Rust,就需要互联网连接。
|
||||
|
||||
@ -64,7 +64,7 @@ $ rustup update
|
||||
$ rustup self uninstall
|
||||
```
|
||||
|
||||
## <a id="troubleshooting"></a>故障排除
|
||||
## <a id="troubleshooting"></a> 故障排除
|
||||
|
||||
要检查当前是否安装了 Rust, 请开启一个 `shell` 并敲入这行命令:
|
||||
|
||||
@ -116,7 +116,7 @@ $ cd hello_world
|
||||
> cd hello_world
|
||||
```
|
||||
|
||||
### <a id="writing-and-running-a-rust-program"></a>编写及运行 Rust 程序
|
||||
### <a id="writing-and-running-a-rust-program"></a> 编写及运行 Rust 程序
|
||||
|
||||
接下来,就要构造一个源代码文件,并命名为 `main.rs`。Rust 文件总是以 `.rs` 扩展名结束。若要在文件名中是一多个单词,那么请使用下划线来将这些单词隔开。比如,请使用 `hello_world.rs` 而不是 `helloworld.rs`。
|
||||
|
||||
|
@ -108,7 +108,7 @@ fn main() {
|
||||
|
||||
这段代码在打印提示消息,表明该游戏是什么及正在请求用户输入。
|
||||
|
||||
## <a id="storing-values-with-variables"></a>使用变量保存那些值
|
||||
## <a id="storing-values-with-variables"></a> 使用变量保存那些值
|
||||
|
||||
接下来,就要创建一个 *变量(variable)* 来存储用户输入,像下面这样:
|
||||
|
||||
@ -152,7 +152,7 @@ let mut bananas = 5; // 可变(mutable)
|
||||
|
||||
其中的 `&` 表明该参数是个 *引用(reference)*,而引用则是一种无需将数据多次拷贝到内存中的情况下,就可以实现代码多个部分对该数据进行读写的特性(注:在 C 家族语言中,`&`表示内存地址,因此 Rust 中的引用,与指针有类似之处)。引用是一项复杂特性,同时 Rust 的主要优点之一,就是安全而便利地运用引用的方式。对于完成这个猜数游戏,是不必对这些细节有过多了解的。现在要明白的是,与变量类似,引用默认也是不可变的。因此,这里就要写上 `&mut guess` 而不是 `&guess`,来令到这个到 `guess` 的引用为可变的。(第 4 章将更详细地对引用进行解释。)
|
||||
|
||||
## <a id="handling-potential-failure-with-the-result-type"></a>处理潜在的带有 `Result` 的程序失效
|
||||
## <a id="handling-potential-failure-with-the-result-type"></a> 处理潜在的带有 `Result` 的程序失效
|
||||
|
||||
**Handle Potential Failure with the `Result` Type**
|
||||
|
||||
@ -240,7 +240,7 @@ $ cargo run ✔
|
||||
此刻,这游戏的第一部分就算完成了:这里正从键盘获取到输入,并随后将输入打印出来。
|
||||
|
||||
|
||||
## <a id="generating-a-random-number"></a>生成秘密数字
|
||||
## <a id="generating-a-random-number"></a> 生成秘密数字
|
||||
|
||||
接下来,就需要生成一个用户将要试着去猜的秘密数字了。生成的秘密数字应每次都不相同,这样这游戏在多次玩的时候才有趣。为了不让这个游戏太难,这里要用一个 `1` 到 `100` 之间的随机数。Rust 在其标准库中尚未包含随机数功能。不过 Rust 团队还真的提供了一个 [`rand` 代码箱](https://crates.io/crates/rand),这里就姑且把这样的代码箱,称之为功能吧。
|
||||
|
||||
@ -426,7 +426,7 @@ $ cargo run ✔
|
||||
|
||||
就会得到不同的随机数字,并且他们都应是 `1` 到 `100` 之间的数字。非常棒!
|
||||
|
||||
## <a id="comparing-the-guess-to-the-secret-number"></a>将猜数与秘数相比较
|
||||
## <a id="comparing-the-guess-to-the-secret-number"></a> 将猜数与秘数相比较
|
||||
|
||||
既然有了用户输入和随机数,就可以加以比较了。比较的步骤在下面的清单 2-4 中给出了。请注意这个代码还不会编译,原因后面会解释。
|
||||
|
||||
@ -599,7 +599,7 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
|
||||
|
||||
敲入 `quit` 就会退出这游戏,不过正如所注意到的,这样做将就要敲入别的非数字输入。至少可以是这种做法是次优的;这里想要在猜到了正确数字时,游戏也要停止。
|
||||
|
||||
## <a id="quitting-after-a-correct-guess"></a>猜对后的退出
|
||||
## <a id="quitting-after-a-correct-guess"></a> 猜对后的退出
|
||||
|
||||
下面就来通过添加一条 `break` 语句,将游戏编程为在用户赢了时退出:
|
||||
|
||||
|
@ -183,7 +183,7 @@ error: could not compile `variables` due to previous error
|
||||
现在已经完成变量运行机制的探讨,接卸来就要看看这些变量可以有的那些其余数据类型了。
|
||||
|
||||
|
||||
## <a id="data-types"></a>数据类型
|
||||
## <a id="data-types"></a> 数据类型
|
||||
|
||||
Rust 的所有值,都属于某种确切的 *数据类型(data type)*,数据类型告诉 Rust 所指定的是何种数据,进而 Rust 才知道该怎样使用那个数据。接下来会看看两个数据类型的子集:标量(scalar)类型与复合(compound)类型。
|
||||
|
||||
@ -219,7 +219,7 @@ fn main() {
|
||||
|
||||
*标量* 类型,表示单个值。Rust 有着四个主要的标量类型:整数、浮点数、布尔值与字符。这些类型,其他语言也有。下面就深入看看他们在 Rust 中是怎样工作的。
|
||||
|
||||
### <a id="integer-types"></a>整形(Integer Types)
|
||||
### <a id="integer-types"></a> 整形(Integer Types)
|
||||
|
||||
*整数* 是不带小数部分的数。在第 2 章中就已用到一种整数类型,即 `u32` 类型。这种类型声明表示变量关联的值,应是个无符号的、占据 32 个二进制位空间的整数(有符号整数以 `i` 而不是 `u` 开头)。下面的表 3-1 给出了 Rust 中内建的那些整数类型。可使用这些变种中的任何一个,取声明出某个整数值的类型。
|
||||
|
||||
@ -363,7 +363,7 @@ fn main() {
|
||||
|
||||
*复合类型(compound types)* 可将多个值组合成一个类型。Rust 有着两个原生的复合类型:元组与数组(tuples and arrays)。
|
||||
|
||||
### <a id="the-tuple-type"></a>元组类型
|
||||
### <a id="the-tuple-type"></a> 元组类型
|
||||
|
||||
元组是将数个不同类型的值,组合成一个复合类型的一般方式。元组是固定长度的:一旦被声明出来,他们的大小就无法扩大或缩小了。
|
||||
|
||||
@ -1170,7 +1170,7 @@ fn main() {
|
||||
此代码结构,消除了使用 `loop`、`if`、`else`、及 `break` 实现同样结构时,很多不可缺少的嵌套,且此结构更为清晰。在条件保持为真期间,代码就会运行;否则,他将退出循环。
|
||||
|
||||
|
||||
### <a id="looping-through-a-collection-with-for"></a>使用 `for` 对集合进行遍历
|
||||
### <a id="looping-through-a-collection-with-for"></a> 使用 `for` 对集合进行遍历
|
||||
|
||||
可选择使用 `while` 结构,来对集合,诸如数组,的那些元素进行循环。作为示例,下面清单 3-4 中的循环,将打印出数组 `a` 中的各个元素。
|
||||
|
||||
|
@ -260,4 +260,54 @@ fn main() {
|
||||
| `$(...) ...` | 宏重复,macro repetition |
|
||||
| `ident! (...)`, `ident! {...}`, `ident! [...]` | 宏调用,macro invocation |
|
||||
|
||||
下表 B-7 展示了创建注释的一些符号。
|
||||
|
||||
**<small>表 B-7:注释</small>**
|
||||
|
||||
| 符号 | 说明 |
|
||||
| :--- | :--- |
|
||||
| `//` | 注释行 |
|
||||
| `//!` | 内层行文档注释,inner line doc comment |
|
||||
| `///` | 外层行文档注释,outter line doc comment |
|
||||
| `/*...*/` | 注释块 |
|
||||
| `/*!...*/` | 内层块文档注释,inner block doc comment |
|
||||
| `/**...*/` | 外层块文档注释,outter block doc comment |
|
||||
|
||||
下表 B-8 展示了出现于用到元组上下文中的一些符号。
|
||||
|
||||
**<small>元组</small>**
|
||||
|
||||
| 符号 | 说明 |
|
||||
| :--- | :--- |
|
||||
| `()` | 空元组(又叫单元值),同时属于字面值与类型 |
|
||||
| `(expr)` | 元括号括起来的表达式,parenthesized expression |
|
||||
| `(expr,)` | 单一元素的元组表达式 |
|
||||
| `(type,)` | 单一元素的元组类型,single-element tuple type |
|
||||
| `(expr, ...)` | 元组表达式 |
|
||||
| `(type, ...)` | 元组类型,tuple type |
|
||||
| `expr(expr, ...)` | 函数调用表达式;还用于初始化一些元组的 `struct` 以及元组的 `enum` 变种,function call expression; also used to initialize tuple `struct`s and tuple `enum` vairants |
|
||||
| `expr.0`, `expr.1` 等等 | 对元组进行索引 |
|
||||
|
||||
下表 B-9 展示了其中用到花括号上下文中的一些符号。
|
||||
|
||||
**<small>表 B-9:花括号</small>**
|
||||
|
||||
| 符号 | 说明 |
|
||||
| :--- | :--- |
|
||||
| `{...}` | 代码块表达式 |
|
||||
| `Type {...}` | `struct` 的字面值 |
|
||||
|
||||
下表 B-10 展示了其中用到方括号上下文中的一些符号。
|
||||
|
||||
**<small>表 B-10:方括号</small>**
|
||||
|
||||
| 符号 | 说明 |
|
||||
| :--- | :--- |
|
||||
| `[...]` | 数组的字面值 |
|
||||
| `[expr; len]` | 包含着 `expr` 的 `len` 拷贝数组的字面值 |
|
||||
| `[type; len]` | 包含着 `len` 个 `type` 的实例数组的字面值 |
|
||||
| `expr[expr]` | 对集合进行索引,collection indexing。是可过载的 `(Index, IndexMut)`,overloadable `(Index, IndexMut)` |
|
||||
| `expr[..]`, `expr[a..]`, `expr[..b]`, `expr[a..b]` | 用到了 `Range`、`RangeFrom`、`RangeTo` 或 `RangeFull` 作为 “索引”的,带有集合切片集合索引,collection indexing pretending to be collection slicing, using `Range`, `RangeFrom`, `RangeTo`, or `RangeFull` as the "index" |
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user