1.生命周期注释的是什么
比喻:给钥匙上贴了一个标签,写着只能周一到周五使用
1.钥匙:一个变量的引用
2.标签:给引用添加 生命周期注释
代码示例
fn main() {
let message = String::from("hello world"); // message 的生命周期开始
let message_ref = &message;
print_message(message_ref);
}
fn print_message<'a>(message: &'a str){ //引用变量作为参数传递在函数间传递时,需要加 'a 标
println !("{}", message)
}
2.借用和所有权的区别
比喻
借用:你借用了朋友的车,但是车还是朋友的,你用完要还给他。他有这个车的使用权
所有权:你买了一个二手车 可以随用使用,也可以卖掉,完全由你控制。原来的人无法使用
代码示例
借用
fn main(){
let my_car = Car { model: "Tesla".to_string() }
drive_car(&my_car) //借用了car // drive_car这个函数借用了my_car, 但是my_car还是属于main这个函数
println!("Finish driving {}",my_car.model) //main这个函数依旧可以使用car
}
所有权
let my_car = Car { model: "Tesla".to_string() }
buy_car(my_car) //buy_car这个函数买了我的车 获得了车的所有权
println!("{}",my_car) //我无法继续使用这个车了 buy_car这个函数可以随意使用
3.结构体中的生命周期
比喻: 1.有一个房间放有多个保险箱(每个保险箱是一个结构体),这个房间里的保险箱钥匙的有效期(结构体字段)必须保留到房间钥匙的有效期
代码示例
struct Book<'a> {
content: &'a str 结构体字段的生命周期注释
}
impl<'a>Book<'a>{
fn new(title: &'a str) ->self { //实例化该结构体
Book {title}
}
fn title(&self) -> &str { //返回结构体的title
self.title
}
}
fn main() {
let title = String::from("Rust Programming");
let book = Book::new(&title); // `book` 借用了 `title` 的一个切片
println!("The book title is: {}", book.title());
// 当 `title` 在这里仍然有效时,`book` 可以安全地使用 `title` 的引用。
}
4.函数中的生命周期
你开车进了一个临时停车场(函数),车辆(数据)可以进来,但是当停车场关闭(函数结束),所有车辆必须离开(数据清理)
// 定义一个函数来处理消息
fn process_message<'a>(message: &'a str) {
println!("Processing message: {}", message);
}
fn main() {
let message = String::from("Hello, world!");
// 调用 process_message 函数
process_message(message.as_str()); //main函数时message.as_str()的所有者,因此main函数结束时,其数据被清理
}