struct Container {
data: String,
}
impl Container {
fn get_closure(&self) -> impl Fn() -> &str {
let data_ref = &self.data;
move || data_ref
}
}
生命周期关系说明
- 闭包定义:在
get_closure
方法中,我们首先创建了一个对 self.data
的引用 data_ref
。然后闭包使用 move
关键字获取了 data_ref
的所有权。这确保了闭包拥有自己的引用副本,而不是直接引用 self
。
- 生命周期一致性:闭包返回的类型是
impl Fn() -> &str
,返回的是一个 &str
引用。由于闭包内部的 data_ref
引用的生命周期是由 self
决定的,而 self
在 get_closure
方法调用期间是有效的,所以 data_ref
的生命周期足以覆盖闭包调用期间。只要 Container
实例在闭包调用时仍然存活,就不会出现悬垂引用。
- 作用域规则:如果
Container
实例在闭包被调用之前被释放,Rust 的借用检查器会在编译时捕获这个错误,因为闭包持有对 Container
数据的引用,并且编译器会确保这个引用的生命周期是正确的。所以在实际使用中,只要遵循 Rust 的所有权和借用规则,就可以避免悬垂引用的问题。