// 定义结构体
struct ComplexStruct<'a, 'b, 'c> {
member1: &'a i32,
member2: &'b mut i32,
member3: &'c str,
}
// 为ComplexStruct实现方法
impl<'a, 'b, 'c> ComplexStruct<'a, 'b, 'c> {
// 获取member1的值,不可变借用
fn get_member1(&self) -> &'a i32 {
self.member1
}
// 修改member2的值,可变借用
fn modify_member2(&mut self, new_value: i32) {
*self.member2 = new_value;
}
// 组合操作,先不可变借用member1,再可变借用member2
fn combined_operation(&mut self, new_value: i32) -> &'a i32 {
let member1_ref = self.member1;
self.modify_member2(new_value);
member1_ref
}
}
方法中生命周期处理逻辑解释
get_member1
方法:
- 该方法返回
member1
的不可变引用。因为member1
的生命周期是'a
,所以返回值的生命周期也必须是'a
。&self
表示不可变借用结构体,在方法内部对self
的使用都是不可变借用,符合Rust的借用规则。
modify_member2
方法:
- 该方法接受一个新值并修改
member2
。&mut self
表示可变借用结构体,只有在可变借用结构体时才能修改其中的可变成员。member2
的生命周期是'b
,在方法内部对member2
进行修改,由于是在可变借用结构体的情况下操作,所以不会违反借用规则。
combined_operation
方法:
- 首先不可变借用
member1
并保存其引用member1_ref
,此时self
处于不可变借用状态。
- 然后调用
modify_member2
方法,这需要可变借用self
。在Rust中,不能在不可变借用self
的同时可变借用self
,但这里先保存了member1
的不可变引用,然后再进行可变借用self
来修改member2
,最后返回保存的member1
的不可变引用。这样就保证了在方法调用链中生命周期的正确性,同时处理了可变借用与不可变借用的交替情况。返回值的生命周期为'a
,与member1
的生命周期一致。