3.7 数据结构中的生命周期
07-数据结构中的生命周期 — Comprehensive Rust
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/lifetimes/struct-lifetimes.html
3.7 数据结构中的生命周期
若数据类型存储借用的数据,必须用生命周期标注:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| // Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
#[derive(Debug)]
enum HighlightColor {
Pink,
Yellow,
}
#[derive(Debug)]
struct Highlight<'document> {
slice: &'document str,
color: HighlightColor,
}
fn main() {
let doc = String::from("The quick brown fox jumps over the lazy dog.");
let noun = Highlight { slice: &doc[16..19], color: HighlightColor::Yellow };
let verb = Highlight { slice: &doc[20..25], color: HighlightColor::Pink };
// drop(doc);
dbg!(noun);
dbg!(verb);
}
|
- 在上面的例子中,
Highlight 上的标注强制要求:被包含的 &str 所依赖的底层数据,至少要与任何使用该数据的 Highlight 实例活得一样长。结构体不能比它所引用的数据活得更久。 - 若在
noun 或 verb 的生命周期结束之前丢弃 doc,借用检查器会报错。 - 带有借用数据的类型会迫使用户持有原始数据。这对创建轻量视图很有用,但通常也使它们更难使用。
- 可能的话,让数据结构直接拥有其数据。
- 某些内部有多个引用的结构体可以有多个生命周期标注。若除了结构体自身的生命周期外,还需要描述引用之间的生命周期关系,这就可能是必要的。那些是非常高级的用例。