面试题答案
一键面试struct MyStruct {
data: String,
}
impl MyStruct {
fn new(data: &str) -> Self {
MyStruct {
data: data.to_string(),
}
}
fn append(&mut self, new_data: &str) -> &mut Self {
self.data.push_str(new_data);
self
}
fn print_length(&self) -> &Self {
println!("Length of data: {}", self.data.len());
self
}
}
可以这样使用链式调用:
fn main() {
let mut my_struct = MyStruct::new("initial");
my_struct
.append(" appended")
.print_length();
}
生命周期管理解释
MyStruct::new
:此方法获取一个&str
类型的参数,它是一个引用,生命周期由调用者决定。在方法内部,将其转换为String
类型并存储在结构体中,这一步并不涉及借用生命周期管理问题,因为data
是结构体的拥有者。MyStruct::append
:此方法获取&mut self
,这意味着获取结构体的可变引用。因为是可变引用,在借用期间,其他任何对self
的引用(无论是可变还是不可变)都不允许。此方法修改self.data
,并返回&mut Self
,这样就可以继续链式调用。其借用生命周期从方法调用开始,到链式调用结束。MyStruct::print_length
:此方法获取&self
,即结构体的不可变引用。不可变引用允许同时存在多个,但不能与可变引用同时存在。它只是读取self.data
的长度并打印,不修改数据。借用生命周期同样从方法调用开始,到链式调用结束。在整个链式调用过程中,append
方法获取可变引用修改数据,print_length
方法获取不可变引用读取数据,严格遵循Rust的借用规则,从而避免编译错误。