mirror of
https://github.com/KaiserY/trpl-zh-cn
synced 2024-11-09 00:43:59 +08:00
Merge branch 'master' of https://github.com/KaiserY/trpl-zh-cn
This commit is contained in:
commit
40431f8f6a
@ -6,7 +6,7 @@
|
||||
|
||||
欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。
|
||||
|
||||
Rust 是一门帮助你编写更快、更可靠软件的编程语言。高层工程学与底层控制在其他编程语言设计中往往是相互矛盾的;通过平很强大的技术能力与优秀的开发体验,Rust 提供了控制底层细节(比如内存使用)的选择,并免受通常随之而来的所有烦恼。
|
||||
Rust 是一门帮助你编写更快、更可靠软件的编程语言。高层工程学与底层控制在其他编程语言设计中往往是相互矛盾的,Rust 则试图挑战该现象。通过对强大的技术能力与优秀的开发体验的平衡,Rust 提供了控制底层细节(比如内存使用)的选择,并免受通常随之而来的所有烦恼。
|
||||
|
||||
## 谁会使用 Rust
|
||||
|
||||
@ -68,7 +68,7 @@ Rust 适用于渴望编程语言的速度与稳定性的开发者。对于速度
|
||||
|
||||
第二十章会完成一个实现了底层多线程 web server 的项目!
|
||||
|
||||
最后是一些附录,包含了一些关于语言的参考风格格式的实用信息。附录 A 涉及了 Rust 的关键字。附录 B 涉及 Rust 的运算符和符号。附录 C 涉及标准库提供的派生 trait。附录 D 设计宏。
|
||||
最后是一些附录,包含了一些关于语言的参考风格格式的实用信息。附录 A 涉及了 Rust 的关键字。附录 B 涉及 Rust 的运算符和符号。附录 C 涉及标准库提供的派生 trait。附录 D 涉及宏。
|
||||
|
||||
怎样阅读本书都不会有任何问题:如果你希望略过一些内容,请继续!如果你发现疑惑可能会再跳回之前的章节。无论怎样都是可以的。
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
第一步是安装 Rust。我们通过 `rustup` 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。你需要网络连接来进行下载。
|
||||
|
||||
接下来的步骤会下载最新的稳定(stable)版 Rust 编译器。本书所有的示例和输出采用稳定版 Rust 1.21.0。Rust 的稳定性保证确保本书所有的例子在更新版本的 Rust 中能够继续编译。不同版本的输出可能有轻微的不同,因为 Rust 经常改进错误信息和警告。换句话说,任何通过这些步骤所安装的更新稳定版 Rust 预期能够使用本书的内容。
|
||||
接下来的步骤会下载最新的稳定(stable)版 Rust 编译器。本书所有的示例和输出采用稳定版 Rust 1.21.0。Rust 的稳定性确保本书所有的例子在更新版本的 Rust 中能够继续编译。不同版本的输出可能有轻微的不同,因为 Rust 经常改进错误信息和警告。换句话说,任何通过这些步骤所安装的更新稳定版 Rust 预期能够使用本书的内容。
|
||||
|
||||
> ### 命令行标记
|
||||
>
|
||||
|
@ -154,7 +154,7 @@ $ cargo build
|
||||
你已经准备好迎来 Rust 之旅的伟大开始!在本章中,你学习了如何:
|
||||
|
||||
* 使用 `rustup` 安装最新稳定版的 Rust
|
||||
* 跟新到新版的 Rust
|
||||
* 更新到新版的 Rust
|
||||
* 打开本地安装的文档
|
||||
* 直接通过 `rustc` 编写并运行 “Hello, world!” 程序
|
||||
* 使用 Cargo 风格创建并运行新项目
|
||||
|
@ -88,7 +88,7 @@ fn main() {
|
||||
use std::io;
|
||||
```
|
||||
|
||||
Rust 默认只在每个程序的 [*prelude*][prelude]<!-- ignore --> 中引入少量类型。如果需要的类型不在 prelude 中,你必须使用一个 `use` 语句显式的将其引入作用域。`std::io` 库提供很多 `io` 相关的功能,比如接受用户输入的功能。
|
||||
Rust 默认只在每个程序的 [*prelude*][prelude]<!-- ignore --> 中引入少量类型。如果需要的类型不在 prelude 中,你必须使用一个 `use` 语句显式地将其引入作用域。`std::io` 库提供很多 `io` 相关的功能,比如接受用户输入的功能。
|
||||
|
||||
[prelude]: https://doc.rust-lang.org/std/prelude/index.html
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
## 控制流
|
||||
|
||||
> [ch03-05-control-flow.md](https://github.com/rust-lang/book/blob/master/src/ch03-05-control-flow.md)
|
||||
> [ch03-05-control-flow.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch03-05-control-flow.md)
|
||||
> <br>
|
||||
> commit ec65990849230388e4ce4db5b7a0cb8a0f0d60e2
|
||||
|
||||
|
@ -20,7 +20,7 @@ Rust 的核心功能(之一)是 **所有权**(*ownership*)。虽然这
|
||||
>
|
||||
> 栈和堆都是代码在运行时可供使用的内存部分,不过他们以不同的结构组成。栈以放入值的顺序存储并以相反顺序取出值。这也被称作 **后进先出**(*last in, first out*)。想象一下一叠盘子:当增加更多盘子时,把他们放在盘子堆的顶部,当需要盘子时,也从顶部拿走。不能从中间也不能从底部增加或拿走盘子!增加数据叫做 **进栈**(*pushing onto the stack*),而移出数据叫做 **出栈**(*popping off the stack*)。
|
||||
>
|
||||
> 操作栈是非常快的,因为它访问数据的方式:永远也不需要寻找一个位置放入新数据或者取出数据因为这个位置总是在栈顶。另一个使得栈快速的性质是栈中的所有数据都必须有一个已知且固定的大小。
|
||||
> 栈因为它访问数据方式的不同而导致操作数据快速:因为数据存取的位置总是在栈顶而不需要寻找一个位置存放或读取数据。另一个栈的属性也让操作栈中数据快速,是因为栈中的所有数据都必须有一个已知且固定的大小。
|
||||
>
|
||||
> 相反对于在编译时未知大小或大小可能变化的数据,可以把他们储存在堆上。堆是缺乏组织的:当向堆放入数据时,我们请求一定大小的空间。操作系统在堆的某处找到一块足够大的空位,把它标记为已使用,并返回给我们一个其位置的 **指针**(*pointer*)。这个过程称作 **在堆上分配内存**(*allocating on the heap*),并且有时这个过程就简称为 “分配”(allocating)。向栈中放入数据并不被认为是分配。因为指针是已知的固定大小的,我们可以将指针储存在栈上,不过当需要实际数据时,必须访问指针。
|
||||
>
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
这里有一个小的编程问题:编写一个获取一个字符串并返回它在其中找到的第一个单词的函数。如果函数没有在字符串中找到一个空格,就意味着整个字符串是一个单词,所以整个字符串都应返回。
|
||||
|
||||
让我们考虑一下这个函数的签名:
|
||||
让我们考虑一下这个函数的声明:
|
||||
|
||||
```rust,ignore
|
||||
fn first_word(s: &String) -> ?
|
||||
@ -93,7 +93,7 @@ fn main() {
|
||||
|
||||
这个程序编译时没有任何错误,而且在调用 `s.clear()` 之后使用 `word` 也不会出错。这时 `word` 与 `s` 状态就完全没有联系了,所以 `word `仍然包含值 `5`。可以尝试用值 `5` 来提取变量 `s` 的第一个单词,不过这是有 bug 的,因为在我们将 `5` 保存到 `word` 之后 `s` 的内容已经改变。
|
||||
|
||||
我们不得不时刻担心 `word` 的索引与 `s` 中的数据不再同步,这是冗余且容易出错的!如果编写这么一个 `second_word` 函数的话,管理索引这件事将更加容易出问题。它的签名看起来像这样:
|
||||
我们不得不时刻担心 `word` 的索引与 `s` 中的数据不再同步,这是冗余且容易出错的!如果编写这么一个 `second_word` 函数的话,管理索引这件事将更加容易出问题。它的声明看起来像这样:
|
||||
|
||||
```rust,ignore
|
||||
fn second_word(s: &String) -> (usize, usize) {
|
||||
@ -157,7 +157,7 @@ let slice = &s[..];
|
||||
|
||||
> 注意:字符串 slice range 的索引必须位于有效的 UTF-8 字符边界内,如果尝试从一个多字节字符的中间位置创建字符串 slice,则程序将会因错误而退出。出于介绍字符串 slice 的目的,本部分假设只使用 ASCII 字符集;第八章的 “字符串” 部分会更加全面的讨论 UTF-8 处理问题。
|
||||
|
||||
在记住所有这些知识后,让我们重写 `first_word` 来返回一个 slice。“字符串 slice” 的类型签名写作 `&str`:
|
||||
在记住所有这些知识后,让我们重写 `first_word` 来返回一个 slice。“字符串 slice” 的类型声明写作 `&str`:
|
||||
|
||||
<span class="filename">文件名: src/main.rs</span>
|
||||
|
||||
@ -228,7 +228,7 @@ let s = "Hello, world!";
|
||||
|
||||
#### 字符串 slice 作为参数
|
||||
|
||||
在知道了能够获取字面值和 `String` 的 slice 后引起了另一个对 `first_word` 的改进,这是它的签名:
|
||||
在知道了能够获取字面值和 `String` 的 slice 后引起了另一个对 `first_word` 的改进,这是它的声明:
|
||||
|
||||
```rust,ignore
|
||||
fn first_word(s: &String) -> &str {
|
||||
|
Loading…
Reference in New Issue
Block a user