MST

星途 面试题库

面试题:Rust闭包返回值在复杂场景下的生命周期管理

假设有一个结构体 `Container`,内部包含一些数据成员,并且有一个方法 `get_closure` 返回一个闭包,这个闭包会使用 `Container` 内部的数据。请写出完整的Rust代码,并详细说明如何正确处理闭包和 `Container` 实例之间的生命周期关系,保证在各种情况下都不会出现悬垂引用。
26.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Container {
    data: String,
}

impl Container {
    fn get_closure(&self) -> impl Fn() -> &str {
        let data_ref = &self.data;
        move || data_ref
    }
}

生命周期关系说明

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