能否返回隐藏vector的引用?Rust闭包生命周期问题咨询
问题解决思路
你代码里的错误本质是:闭包捕获了new函数内创建的vec,但FnMut闭包不允许返回指向捕获变量的引用——因为闭包执行完毕后,捕获的vec所有权仍在闭包内部,外部拿到的引用生命周期无法和MyStruct的生命周期'a绑定,编译器会判定这个引用可能在vec被销毁后依然存在,从而抛出逃逸错误。
要实现「暴露与MyStruct同生命周期的vector片段」且不用Box包裹闭包的需求,你需要把vec的所有权转移到MyStruct本身,而不是让闭包捕获它。直接通过结构体的方法来完成添加元素和返回片段的逻辑即可:
struct MyStruct { vec: Vec<u32>, } impl MyStruct { pub fn new() -> Self { Self { vec: vec![0u32, 2u32], } } pub fn add_and_return_last_two(&mut self, add: &[u32]) -> &[u32] { self.vec.extend_from_slice(add); let len = self.vec.len(); &self.vec[len - 2..len] } }
说明
vec现在是MyStruct的字段,生命周期和结构体完全一致,方法返回的引用自然继承了结构体的生命周期,不会出现逃逸问题。- 不需要任何
Box或闭包,直接通过结构体的可变方法完成逻辑,完全符合你的需求。 - 如果一定要保留类似闭包的调用形式(但不用
Box),可以考虑自定义一个函数类型,但这种场景下直接用结构体方法更简洁直观。
内容的提问来源于stack exchange,提问作者Yuval Saraf
相关产品推荐
相关产品推荐

