面试题答案
一键面试// 定义Cache结构体
struct Cache<T> {
data: Vec<T>,
}
// Cache结构体的关联函数,用于创建新的Cache实例
impl<T> Cache<T> {
fn new() -> Self {
Cache { data: Vec::new() }
}
}
// 定义Loader trait
trait Loader<T> {
fn load(&mut self, cache: &mut Cache<T>);
}
// 示例实现Loader trait
struct DataLoader;
impl<T> Loader<T> for DataLoader {
fn load(&mut self, cache: &mut Cache<T>) {
// 假设从外部加载了一些数据
let new_data: Vec<T> = vec![Default::default(); 5];
cache.data.extend(new_data);
}
}
fn main() {
let mut cache = Cache::new();
let mut loader = DataLoader;
loader.load(&mut cache);
println!("Cache data: {:?}", cache.data);
}
生命周期标注说明
Cache
结构体: 由于Cache
结构体内部使用Vec
存储数据,Vec
会自动管理其内部数据的生命周期,所以Cache
结构体本身不需要显式的生命周期标注。Loader
trait:load
方法接受一个可变的cache
引用,因为要更新Cache
的数据。这里cache
的生命周期和方法调用的作用域相关联,由于cache
是一个可变引用,在方法调用期间,cache
所指向的Cache
实例不能被其他代码访问,以确保内存安全。同时,self
也是可变引用,同样在方法调用期间独占,避免数据竞争。Cache::new
: 此关联函数创建一个新的Cache
实例,不涉及引用,所以不需要生命周期标注。
通过上述代码和生命周期标注,可以确保内存安全和正确的生命周期管理。Vec
自动管理其内部数据的内存,并且通过合理的引用使用,避免了悬空引用、数据竞争等内存安全问题。