Rust 生命周期:保质期管理
生命周期 (Lifetimes) 是 Rust 引用有效性的作用域。大多数时候 Rust 能自动推断,但有时需要我们手动标注。
⏳ 借用检查器 (Borrow Checker)
Rust 编译器内建了一个借用检查器,用于比较作用域,确保所有的借用都是有效的。
fn main() {
let r;
{
let x = 5;
r = &x; // ❌ 错误!x 在这里就会死掉,但 r 还想在外面活
}
// println!("r: {}", r);
}
🏷️ 生命周期标注语法
生命周期标注不会改变生命周期的长短,只是为了告诉编译器多个引用之间的关系。通常用 'a 表示。
// 这个函数返回的引用,其有效期等于 x 和 y 中较短的那个
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
🗿 静态生命周期 ('static)
'static 是一个特殊的生命周期,表示引用可以存活于整个程序的运行期间(例如字符串字面量)。
let s: &'static str = "我永远不死!";
🏠 结构体中的生命周期
如果结构体里包含引用,也需要标注生命周期。
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first_sentence = novel.split('.').next().expect("Could not find a '.'");
let i = ImportantExcerpt {
part: first_sentence,
};
}