From bfc909f57a332191833d16b4e512e0e061ca90ac Mon Sep 17 00:00:00 2001 From: Unisko PENG Date: Fri, 21 Apr 2023 13:11:25 +0800 Subject: [PATCH] Update Ch10 --- src/Ch10_Generic_Types_Traits_and_Lifetimes.md | 14 +++++++------- src/Ch21_Appendix.md | 6 ++++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md index 463e4b3..359fd0c 100644 --- a/src/Ch10_Generic_Types_Traits_and_Lifetimes.md +++ b/src/Ch10_Generic_Types_Traits_and_Lifetimes.md @@ -1278,7 +1278,7 @@ fn first_word<'a>(s: &'a str) -> &'a str { 由于存在合并更多确定性模式,并将他们到编译器的可能,因此讲 Rust 的这段历史是有必要的。今后,或许就只要求更少甚至没有生命周期注解。 -编程到 Rust 的引用分析中的那些确定性模式,被称为 *生命周期省略规则,lifetime elision rules*。这些规则并非 Rust 程序员要遵循的;他们是编译器将考虑的一套特殊情形,并在咱们的代码符合这些情形时,咱们就不需要显式地写出生命周期。 +编程到 Rust 引用分析中的那些确定性模式,被称为 *生命周期省略规则,lifetime elision rules*。这些规则并非 Rust 程序员要遵循的;他们是编译器将考虑的一套特殊情形,并在咱们的代码符合这些情形时,咱们就不需要显式地写出生命周期。 这些省略规则并不提供完全的推断。在 Rust 明确地应用了这些规则,但仍存在引用具有什么样的生命周期方面的模糊性时,编译器将不会就其余引用变量应有什么样的生命周期,加以猜测。相比于猜测,编译器将给到咱们,可通过添加生命周期注解而解决的一个报错。 @@ -1290,9 +1290,9 @@ fn first_word<'a>(s: &'a str) -> &'a str { 第二条规则,则是当确切地只有一个输入生命周期参数时,那个生命周期,就被指派给全部输出生命周期参数:`fn foo<'a>(x: &'a i32) -> &'a i32`。 -第三条规则,当有多个输入生命周期参数,而由于这是个方法,其中之一为 `&self` 或 `&mut self` 时,那么 `self` 的生命周期,便会被指派给全部输出生命周期参数。由于只有较少必要符号,因此这第三条规则,就会令到方法阅读与编写起来体验更佳。 +第三条规则,当有多个输入生命周期参数,而由于这是个方法(这条规则是针对结构体上的方法),其中之一为 `&self` 或 `&mut self` 时,那么 `self` 的生命周期,便会被指派给全部输出生命周期参数。由于只有较少必要符号,因此这第三条规则,就会令到方法阅读与编写起来体验更佳。 -下面咱们就来充当一下编译器。咱们将应用这些规则,来计算出清单 10-25 中,`first_word` 函数签名里各个引用的生命周期。函数签名以不带与其中引用关联的任何生命周期开始: +下面咱们就来充当编译器。咱们将应用这些规则,来计算出清单 10-25 中,`first_word` 函数签名里各个引用的生命周期。函数签名以不带与其中引用关联的任何生命周期开始: ```rust fn first_word(s: &str) -> &str { @@ -1312,21 +1312,21 @@ fn first_word<'a>(s: &'a str) -> &'a str { 现在这个函数签名中的全部引用,都有了生命周期,进而编译器就可以在无需程序员注解函数签名中的生命周期的情况下,继续其分析了。 -接下来就要看看另一个示例,这次要使用在清单 10-20 中,一开始编写时没有生命周期参数的那个 `longest` 函数: +接下来就要看看另一个示例,这次要使用清单 10-20 中,一开始编写时没有生命周期参数的那个 `longest` 函数: ```rust fn longest(x: &str, y: &str) -> &str { ``` -首先来应用第一条规则:各个参数都得到其自己的生命周期。这次有两个而非一个参数,那么这里就有两个生命周期: +首先来应用第一条规则:各个参数都得到自己的生命周期。这次不是一个而是两个参数,那么这里就有两个生命周期: ```rust fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str { ``` -可以看到,由于这里有多于一个的输入生命周期,因此第二条规则并不使用了。至于第三条规则,由于 `longest` 是个函数而非方法,那么这些参数中没有一个是 `self`,因此第三条规则也不适用。在历经了全部三条规则后,这里仍未计算出返回值类型的生命周期为何物。这就是为何在尝试编译清单 10-20 中代码时收到错误的原因:编译器历经这些生命周期省略规则,而仍未计算出该函数签名中引用的全部生命周期。 +咱们可以看出,由于有多于一个的输入生命周期,因此第二条规则便不适用。因为 `longest` 是个函数而非方法,参数中没有一个是 `self`,因此第三条规则也不适用。在历经全部三条规则后,咱们仍未计算出返回值类型的生命周期为何。这就是咱们在尝试编译清单 10-20 中代码时,收到错误的原因:编译器历经这些生命周期省略规则,而仍未计算出函数签名中引用的全部生命周期。 -由于这第三条规则,真的只适用于方法签名中,这里接下来就要看看,在方法语境中的生命周期,从而发现这第三条规则,就意味着不必甚为频繁地在方法签名中对生命周期进行注解。 +由于第三条规则实际上只适用于方法签名,咱们接下来就要看看在方法上下文中的生命周期,以发现为何第三条规则,就意味着咱们不必经常注解方法签名中的生命周期。 ### 方法定义中的生命周期注解 diff --git a/src/Ch21_Appendix.md b/src/Ch21_Appendix.md index 73143fe..72228c0 100644 --- a/src/Ch21_Appendix.md +++ b/src/Ch21_Appendix.md @@ -827,6 +827,11 @@ The `+` syntax for specifying multiple trait bounds, 参见:[使用 + 语法 `where` clauses, 参见 []() +- 生命周期省略规则 + +Lifetime elision rules, 编程到 Rust 引用分析中的一些确定性模式。 + + - 输入生命周期 Input lifetimes,函数或方法上的生命周期 @@ -835,3 +840,4 @@ Input lifetimes,函数或方法上的生命周期 - 输出生命周期 Output lifetimes, 返回值上的生命周期 +