From 58f94689255a8d7f7d993184af75941f818335f0 Mon Sep 17 00:00:00 2001 From: KaiserY Date: Wed, 6 Dec 2023 16:19:01 +0800 Subject: [PATCH] update ch05-01 & ch09-02 close #753 --- src/ch05-01-defining-structs.md | 2 +- src/ch09-02-recoverable-errors-with-result.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ch05-01-defining-structs.md b/src/ch05-01-defining-structs.md index 3846532..c262365 100644 --- a/src/ch05-01-defining-structs.md +++ b/src/ch05-01-defining-structs.md @@ -116,7 +116,7 @@ {{#rustdoc_include ../listings/ch05-using-structs-to-structure-related-data/no-listing-04-unit-like-structs/src/main.rs}} ``` -要定义 `AlwaysEqual`,我们使用 `struct` 关键字,我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 `subject` 变量中获得 `AlwaysEqual` 的实例:使用我们定义的名称,不需要任何花括号或圆括号。想象一下,我们将实现这个类型的行为,即每个实例始终等于每一个其他类型的实例,也许是为了获得一个已知的结果以便进行测试。我们不需要任何数据来实现这种行为,你将在第十章中,看到如何定义特性并在任何类型上实现它们,包括类单元结构体。 +为了定义 `AlwaysEqual`,我们使用 `struct` 关键字,接着是我们想要的名称,然后是一个分号。不需要花括号或圆括号!然后,我们可以以类似的方式在 `subject` 变量中创建 `AlwaysEqual` 的实例:只需使用我们定义的名称,无需任何花括号或圆括号。设想我们稍后将为这个类型实现某种行为,使得每个 `AlwaysEqual` 的实例始终等于任何其它类型的实例,也许是为了获得一个已知的结果以便进行测试。我们无需要任何数据来实现这种行为!在第十章中,你会看到如何定义特征并在任何类型上实现它们,包括类单元结构体。 > ### 结构体数据的所有权 > diff --git a/src/ch09-02-recoverable-errors-with-result.md b/src/ch09-02-recoverable-errors-with-result.md index 62b9d25..6527301 100644 --- a/src/ch09-02-recoverable-errors-with-result.md +++ b/src/ch09-02-recoverable-errors-with-result.md @@ -150,7 +150,7 @@ src/libcore/result.rs:906:4 函数体以调用 `File::open` 函数开始。接着使用 `match` 处理返回值 `Result`,类似示例 9-4,如果 `File::open` 成功了,模式变量 `file` 中的文件句柄就变成了可变变量 `username_file` 中的值,接着函数继续执行。在 `Err` 的情况下,我们没有调用 `panic!`,而是使用 `return` 关键字提前结束整个函数,并将来自 `File::open` 的错误值(现在在模式变量 `e` 中)作为函数的错误值传回给调用者。 -所以如果 `username_file` 中有了一个文件句柄,该数接着在变量 `username` 中创建了一个新 `String` 并调用文件句柄 `username_file` 的 `read_to_string` 方法来将文件的内容读取到 `username` 中。`read_to_string` 方法也会返回一个 `Result`,因为它可能会失败,哪怕是 `File::open` 已经成功了。所以我们需要另一个 `match` 来处理这个 `Result`:如果 `read_to_string` 成功了,那么这个函数就成功了,并返回文件中的用户名,它现在位于被封装进 `Ok` 的 `username` 中。如果`read_to_string` 失败了,则像之前处理 `File::open` 的返回值的 `match` 那样返回错误值。不过并不需要显式地调用 `return`,因为这是函数的最后一个表达式。 +所以,如果在 `username_file` 中有一个文件句柄,该函数随后会在变量 `username` 中创建一个新的 `String` 并调用文件句柄 `username_file` 上的 `read_to_string` 方法,以将文件的内容读入 `username`。`read_to_string` 方法也返回一个 `Result`,因为它可能会失败,哪怕是 `File::open` 已经成功了。因此,我们需要另一个 `match` 来处理这个 `Result`:如果 `read_to_string` 执行成功,那么这个函数也就成功了,我们将从文件中读取的用户名返回,此时用户名位于被封装进 `Ok` 的 `username` 中。如果 `read_to_string` 执行失败,则像之前处理 `File::open` 的返回值的 `match` 那样返回错误值。然而,我们无需显式调用 `return` 语句,因为这是函数的最后一个表达式。 调用这个函数的代码最终会得到一个包含用户名的 `Ok` 值,或者一个包含 `io::Error` 的 `Err` 值。我们无从得知调用者会如何处理这些值。例如,如果他们得到了一个 `Err` 值,他们可能会选择 `panic!` 并使程序崩溃、使用一个默认的用户名或者从文件之外的地方寻找用户名。我们没有足够的信息知晓调用者具体会如何尝试,所以将所有的成功或失败信息向上传播,让他们选择合适的处理方法。