Update Ch10

This commit is contained in:
Unisko PENG 2023-04-21 15:25:36 +08:00
parent cc6e0e6d4c
commit 4cddcfd683

View File

@ -1350,9 +1350,9 @@ impl<'a> ImportantExcerpt<'a> {
```
`impl` 后的生命周期参数声明,与类型名字后其使用,都是必须的,但由于第一条省略规则的原因,咱们未被要求注解到 `self` 引用的生命周期。
`impl` 后的生命周期参数声明,与类型名字后其使用,都是必须的,但由于第一条省略规则的原因,咱们未被要求注解其中`self` 引用的生命周期。
下面是个其中适用第三条生命周期省略规则的示例:
下面是个其中第三条生命周期省略规则适用的示例:
```rust
impl<'a> ImportantExcerpt<'a> {
@ -1363,20 +1363,22 @@ impl<'a> ImportantExcerpt<'a> {
}
```
这里有两个输入生命周期,那么 Rust 就会适用首条生命周期省略规则,并赋予到 `&self``announcement` 其各自的生命周期。随后由于其中一个参数是 `&self`,那么返回值类型就会得到 `&self` 的生命周期,进而全部生命周期都得到了计算。
这里有两个输入生命周期,那么 Rust 就会适用首条生命周期省略规则,而赋予 `&self``announcement` 其各自的生命周期。随后由于其中一个参数是 `&self`,那么返回值类型就会得到 `&self` 的生命周期,进而全部生命周期都得到了计算。
### 静态生命周期
这里需要讨论的一种特俗生命周期,那就是 `'static`,这表示了受其影响的引用,*可以* 存活到程序整个持续时间。所有字符串字面值,都有着 `'static` 的生命周期,可将这种特性注解为下面这样:
**The Static Lifetime**
咱们需要讨论的一种特殊生命周期是 `'static`,其表示受其影响的引用,*可以* 在程序整个持续时间内存活。所有字符串字面值,都有着 `'static` 的生命周期,咱们可将其注解为下面这样:
```rust
let s: &'static str = "我有静态的生命周期。";
```
此字符串的文本,是直接存储在该程序二进制数据中的,而程序二进制数据则是一直可用的。因此,所有字符串字面值的生命周期,就`'static`
此字符串的文本,被直接存储在该程序二进制数据中,而这是一直可用的。由此,所有字符串字面值的生命周期便`'static`
在一些错误消息中,或许会看到使用 `'static` 生命周期的建议。不过在`'static` 指定为某个引用的生命周期之前,请想一下手头的这个引用,是不是真的会存活到整个程序的生命周期,以及是否想要这个引用存活到程序的整个生命周期。多数时候,某个建议 `'static` 生命周期的错误消息,都是由尝试创建悬空引用,或可行的生命周期不匹配造成的。在这些情况下,解决办法是修复这些问题,而不是指定这个 `'static` 生命周期。
在一些错误消息中,咱们或许会看到使用 `'static` 生命周期的建议。不过在给引用指定 `'static` 生命周期之前,请考虑一下手头的这个引用,是否会存活到整个程序的生命周期,以及咱们是否想要他存活到整个程序的生命周期。多数时候,建议 `'static` 生命周期的错误消息,都是由尝试创建悬空引用,或可用生命周期不匹配导致。在这些情况下,解决办法是修复这些问题,而非指定出 `'static` 生命周期。
## 泛型参数、特质边界与生命周期三位一体
@ -1384,7 +1386,7 @@ let s: &'static str = "我有静态的生命周期。";
**Generic Type Parameters, Trait Bounds, and Lifetimes Together**
下面就来简要地看看,在一个函数中,同时指定出全部的泛型参数、特质边界与生命周期的语法!
咱们来简要地看看,在一个函数中,一起指定出泛型参数、特质边界与生命周期的语法!
```rust
use std::fmt::Display;
@ -1406,11 +1408,11 @@ where
}
```
是清单 10-21 中,返回两个字符串切片中较长者的那个 `longest` 函数。不过现在他有了个名为 `ann`、泛型 `T` 的额外参数,这个泛型 `T` 可填入任何的、实现了那个`where` 子句所指定的 `Display` 特质的类型。这个额外参数,将被使用 `{}` 打印出来,这就是 `Display` 特质作为必要的原因。由于生命周期是一种通用类型,因此这里的生命周期参数 `'a` 与泛型参数 `T`,就处于函数名称之后尖括号内部的同一清单里头
便是清单 10-21 中,返回两个字符串切片中较长者的 `longest` 函数。不过现在他有了个泛型 `T` 名为 `ann` 的额外参数,泛型 `T` 可以实现了`where` 子句所指定的 `Display` 特质的任何类型填入。这个额外参数,将被使用 `{}` 打印出来,这便是为何 `Display` 特质为必要的原因。由于生命周期是泛型的一种,因此其中的生命周期参数 `'a` 与泛型参数 `T`,便处于函数名称后尖括号内的同一清单里
## 本章小结
在这一章中,涉及到了很多东西!既然了解了泛型参数、特质与特质边界,以及通用生命周期参数,那么就算准备好编写在许多不同情形下,不带有重复的工作代码了。泛型参数实现了将代码应用于不同类型。特质与特质边界确保即使类型是通用的,他们仍将有着代码所需的行为。咱们还掌握了运用生命周期注解,来保证这样的灵活代码不会有任何的悬空引用。而全部的这种分析,都是发生在编译时,这样的特性未对运行时性能造成影响
在这一章中,咱们谈到了很多东西!现在咱们清楚了泛型参数、特质与特质边界,与泛型生命周期参数,那么就准备好编写在许多不同情况下工作,不带有重复的代码了。泛型参数实现了将代码应用于不同类型。特质与特质边界确保即使类型是通用的,他们仍将有着代码所需的行为。咱们了解了如何使用生命周期注解,来保证这种灵活代码不会有任何悬空引用。且所有分析,都发生在编译时,其不会影响到运行时性能
不论相信与否,本章讨论的这些话题,要掌握的东西远不止这些:第 17 章会讨论特质对象trait objects那是另一种运用特质的方式。同时则还有更多只会在甚为高级场合会需要用到生命周期注解的复杂场景为着这些目的就要阅读一下 [Rust 指南](https://doc.rust-lang.org/reference/index.html)。不过接下来,就会掌握怎样编写 Rust 中的测试,这样就可以确保所咱们的代码,以其应该有的方式工作。
不论相信与否,关于咱们在本章讨论的这些话题,要掌握的东西远不止这些:第 17 章会讨论特质对象trait objects其是运用特质的另一种方式。还有更多咱们只会在极复杂场景下才需要的涉及到更复杂场景的生命周期注解要了解那些生命周期注解咱们应阅读 [Rust 指南](https://doc.rust-lang.org/reference/index.html)。不过接下来,咱们将了解怎样编写 Rust 中的测试,从而就可以确保所咱们的代码,以其应有的方式工作。