Skip to content

Commit

Permalink
Merge pull request #736 from LiuYinCarl/main
Browse files Browse the repository at this point in the history
修改错误语法 '他们' -> '它们' 和部分语法
  • Loading branch information
KaiserY authored Sep 25, 2023
2 parents 9950342 + 76aa7d7 commit cb2fdf4
Show file tree
Hide file tree
Showing 48 changed files with 125 additions and 125 deletions.
2 changes: 1 addition & 1 deletion src/appendix-02-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@

### 非运算符符号

下面的列表中包含了所有和运算符不一样功能的符号;也就是说,他们并不像函数调用或方法调用一样表现
下面的列表中包含了所有和运算符不一样功能的符号;也就是说,它们并不像函数调用或方法调用一样表现

表 B-2 展示了以其自身出现以及出现在合法其他各个地方的符号。

Expand Down
8 changes: 4 additions & 4 deletions src/ch04-01-what-is-ownership.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ Rust 采取了一个不同的策略:内存在拥有它的变量离开作用域
{{#rustdoc_include ../listings/ch04-understanding-ownership/no-listing-03-string-move/src/main.rs:here}}
```

这看起来与上面的代码非常类似,所以我们可能会假设他们的运行方式也是类似的:也就是说,第二行可能会生成一个 `s1` 的拷贝并绑定到 `s2` 上。不过,事实上并不完全是这样。
这看起来与上面的代码非常类似,所以我们可能会假设它们的运行方式也是类似的:也就是说,第二行可能会生成一个 `s1` 的拷贝并绑定到 `s2` 上。不过,事实上并不完全是这样。

看看图 4-1 以了解 `String` 的底层会发生什么。`String` 由三部分组成,如图左侧所示:一个指向存放字符串内容内存的指针,一个长度,和一个容量。这一组数据存储在栈上。右侧则是堆上存放内容的内存部分。

Expand Down Expand Up @@ -157,7 +157,7 @@ src="img/trpl04-03.svg" class="center" style="width: 50%;" />

<span class="caption">图 4-3:另一个 `s2 = s1` 时可能的内存表现,如果 Rust 同时也拷贝了堆上的数据的话</span>

之前我们提到过当变量离开作用域后,Rust 自动调用 `drop` 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 `s2``s1` 离开作用域,他们都会尝试释放相同的内存。这是一个叫做 **二次释放***double free*)的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。
之前我们提到过当变量离开作用域后,Rust 自动调用 `drop` 函数并清理变量的堆内存。不过图 4-2 展示了两个数据指针指向了同一位置。这就有了一个问题:当 `s2``s1` 离开作用域,它们都会尝试释放相同的内存。这是一个叫做 **二次释放***double free*)的错误,也是之前提到过的内存安全性 bug 之一。两次释放(相同)内存会导致内存污染,它可能会导致潜在的安全漏洞。

为了确保内存安全,在 `let s2 = s1;` 之后,Rust 认为 `s1` 不再有效,因此 Rust 不需要在 `s1` 离开作用域后清理任何东西。看看在 `s2` 被创建之后尝试使用 `s1` 会发生什么;这段代码不能运行:

Expand Down Expand Up @@ -203,7 +203,7 @@ access the heap data." src="img/trpl04-04.svg" class="center" style="width:

#### 只在栈上的数据:拷贝

这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,他们是示例 4-2 中的一部分:
这里还有一个没有提到的小窍门。这些代码使用了整型并且是有效的,它们是示例 4-2 中的一部分:

```rust
{{#rustdoc_include ../listings/ch04-understanding-ownership/no-listing-06-copy/src/main.rs:here}}
Expand Down Expand Up @@ -237,7 +237,7 @@ Rust 不允许自身或其任何部分实现了 `Drop` trait 的类型使用 `Co

<span class="caption">示例 4-3:带有所有权和作用域注释的函数</span>

当尝试在调用 `takes_ownership` 后使用 `s` 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 `main` 函数中添加使用 `s``x` 的代码来看看哪里能使用他们,以及所有权规则会在哪里阻止我们这么做。
当尝试在调用 `takes_ownership` 后使用 `s` 时,Rust 会抛出一个编译时错误。这些静态检查使我们免于犯错。试试在 `main` 函数中添加使用 `s``x` 的代码来看看哪里能使用它们,以及所有权规则会在哪里阻止我们这么做。

### 返回值与作用域

Expand Down
4 changes: 2 additions & 2 deletions src/ch05-02-example-structs.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
> <br>
> commit 8612c4a5801b61f8d2e952f8bbbb444692ff1ec2
为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代他们为止
为了理解何时会需要使用结构体,让我们编写一个计算长方形面积的程序。我们会从单独的变量开始,接着重构程序直到使用结构体替代它们为止

使用 Cargo 新建一个叫做 *rectangles* 的二进制程序,它获取以像素为单位的长方形的宽度和高度,并计算出长方形的面积。示例 5-8 显示了位于项目的 *src/main.rs* 中的小程序,它刚刚好实现此功能:

Expand Down Expand Up @@ -146,7 +146,7 @@ Rust **确实** 包含了打印出调试信息的功能,不过我们必须为

我们可以看到第一点输出来自 *src/main.rs* 第 10 行,我们正在调试表达式 `30 * scale`,其结果值是 `60`(为整数实现的 `Debug` 格式化是只打印它们的值)。在 *src/main.rs* 第 14 行 的 `dbg!` 调用输出 `&rect1` 的值,即 `Rectangle` 结构。这个输出使用了更为易读的 `Debug` 格式。当你试图弄清楚你的代码在做什么时,`dbg!` 宏可能真的很有帮助!

除了 `Debug` trait,Rust 还为我们提供了很多可以通过 `derive` 属性来使用的 trait,他们可以为我们的自定义类型增加实用的行为[附录 C][app-c] 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 `derive` 之外,还有很多属性;更多信息请参见 [Rust Reference][attributes] 的 Attributes 部分。
除了 `Debug` trait,Rust 还为我们提供了很多可以通过 `derive` 属性来使用的 trait,它们可以为我们的自定义类型增加实用的行为[附录 C][app-c] 中列出了这些 trait 和行为。第十章会介绍如何通过自定义行为来实现这些 trait,同时还有如何创建你自己的 trait。除了 `derive` 之外,还有很多属性;更多信息请参见 [Rust Reference][attributes] 的 Attributes 部分。

我们的 `area` 函数是非常特殊的,它只计算长方形的面积。如果这个行为与 `Rectangle` 结构体再结合得更紧密一些就更好了,因为它不能用于其他类型。现在让我们看看如何继续重构这些代码,来将 `area` 函数协调进 `Rectangle` 类型定义的 `area` **方法** 中。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ backyard

我们定义一个模块,是以 `mod` 关键字为起始,然后指定模块的名字(本例中叫做 `front_of_house`),并且用花括号包围模块的主体。在模块内,我们还可以定义其他的模块,就像本例中的 `hosting``serving` 模块。模块还可以保存一些定义的其他项,比如结构体、枚举、常量、特性、或者函数。

通过使用模块,我们可以将相关的定义分组到一起,并指出他们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。
通过使用模块,我们可以将相关的定义分组到一起,并指出它们为什么相关。程序员可以通过使用这段代码,更加容易地找到他们想要的定义,因为他们可以基于分组来对代码进行导航,而不需要阅读所有的定义。程序员向这段代码中添加一个新的功能时,他们也会知道代码应该放置在何处,可以保持程序的组织性。

在前面我们提到了,`src/main.rs``src/lib.rs` 叫做 crate 根。之所以这样叫它们是因为这两个文件的内容都分别在 crate 模块结构的根组成了一个名为 `crate` 的模块,该结构被称为 *模块树**module tree*)。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

错误信息说 `hosting` 模块是私有的。换句话说,我们拥有 `hosting` 模块和 `add_to_waitlist` 函数的的正确路径,但是 Rust 不让我们使用,因为它不能访问私有片段。在 Rust 中,默认所有项(函数、方法、结构体、枚举、模块和常量)对父模块都是私有的。如果希望创建一个私有函数或结构体,你可以将其放入一个模块。

父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用他们父模块中的项。这是因为子模块封装并隐藏了他们的实现详情,但是子模块可以看到他们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。
父模块中的项不能使用子模块中的私有项,但是子模块中的项可以使用它们父模块中的项。这是因为子模块封装并隐藏了它们的实现详情,但是子模块可以看到它们定义的上下文。继续拿餐馆作比喻,把私有性规则想象成餐馆的后台办公室:餐馆内的事务对餐厅顾客来说是不可知的,但办公室经理可以洞悉其经营的餐厅并在其中做任何事情。

Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部实现细节。这样一来,你就知道可以更改内部代码的哪些部分而不会破坏外部代码。不过 Rust 也确实提供了通过使用 `pub` 关键字来创建公共项,使子模块的内部部分暴露给上级模块。

Expand Down Expand Up @@ -80,7 +80,7 @@ Rust 选择以这种方式来实现模块系统功能,因此默认隐藏内部
```

<span class="caption">示例 7-7: 为 `mod hosting`
`fn add_to_waitlist` 添加 `pub` 关键字使他们可以在
`fn add_to_waitlist` 添加 `pub` 关键字使它们可以在
`eat_at_restaurant` 函数中被调用</span>

现在代码可以编译通过了!为了了解为何增加 `pub` 关键字使得我们可以在 `add_to_waitlist` 中调用这些路径与私有性规则有关,让我们看看绝对路径和相对路径。
Expand Down
2 changes: 1 addition & 1 deletion src/ch07-05-separating-modules-into-different-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
>
> 如果你对同一模块同时使用这两种路径风格,会得到一个编译错误。在同一项目中的不同模块混用不同的路径风格是允许的,不过这会使他人感到疑惑。
>
> 使用 *mod.rs* 这一文件名的风格的主要缺点是会导致项目中出现很多 *mod.rs* 文件,当你在编辑器中同时打开他们时会感到疑惑
> 使用 *mod.rs* 这一文件名的风格的主要缺点是会导致项目中出现很多 *mod.rs* 文件,当你在编辑器中同时打开它们时会感到疑惑
我们将各个模块的代码移动到独立文件了,同时模块树依旧相同。`eat_at_restaurant` 中的函数调用也无需修改继续保持有效,即便其定义存在于不同的文件中。这个技巧让你可以在模块代码增长时,将它们移动到新文件中。

Expand Down
2 changes: 1 addition & 1 deletion src/ch08-01-vectors.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Rust 提供了两种引用元素的方法的原因是当尝试使用现有元素

<span class="caption">示例 8-7:通过 `for` 循环遍历 vector 的元素并打印</span>

我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变他们。示例 8-8 中的 `for` 循环会给每一个元素加 `50`
我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们。示例 8-8 中的 `for` 循环会给每一个元素加 `50`

```rust
{{#rustdoc_include ../listings/ch08-common-collections/listing-08-08/src/main.rs:here}}
Expand Down
2 changes: 1 addition & 1 deletion src/ch09-00-error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@

Rust 将错误分为两大类:**可恢复的***recoverable*)和 **不可恢复的***unrecoverable*)错误。对于一个可恢复的错误,比如文件未找到的错误,我们很可能只想向用户报告问题并重试操作。不可恢复的错误总是 bug 出现的征兆,比如试图访问一个超过数组末端的位置,因此我们要立即停止程序。

大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理他们。Rust 没有异常。相反,它有 `Result<T, E>` 类型,用于处理可恢复的错误,还有 `panic!` 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 `panic!` 调用,接着会讲到如何返回 `Result<T, E>`。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。
大多数语言并不区分这两种错误,并采用类似异常这样方式统一处理它们。Rust 没有异常。相反,它有 `Result<T, E>` 类型,用于处理可恢复的错误,还有 `panic!` 宏,在程序遇到不可恢复的错误时停止执行。本章首先介绍 `panic!` 调用,接着会讲到如何返回 `Result<T, E>`。此外,我们将探讨在决定是尝试从错误中恢复还是停止执行时的注意事项。
2 changes: 1 addition & 1 deletion src/ch09-02-recoverable-errors-with-result.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ src/libcore/result.rs:906:4

`main` 函数也可以返回任何实现了 [`std::process::Termination` trait][termination] 的类型,它包含了一个返回 `ExitCode``report` 函数。请查阅标准库文档了解更多为自定义类型实现 `Termination` trait 的细节。

现在我们讨论过了调用 `panic!` 或返回 `Result` 的细节,是时候回到他们各自适合哪些场景的话题了
现在我们讨论过了调用 `panic!` 或返回 `Result` 的细节,是时候回到它们各自适合哪些场景的话题了

[handle_failure]: ch02-00-guessing-game-tutorial.html#使用-result-类型来处理潜在的错误
[trait-objects]: ch17-02-trait-objects.html#为使用不同类型的值而设计的-trait-对象
Expand Down
Loading

0 comments on commit cb2fdf4

Please sign in to comment.