如何返回引用局部变量的不可修改结构体?
问题:返回持有局部变量引用的外部结构体实例
我有一个来自外部 crate 的结构体Data,无法修改它,这个结构体持有一个可变数组的引用。现在我想返回该结构体的实例,但做不到——因为它引用了局部变量。我试过用Rc<RefCell<>>、Box等方式,都没法把data和bytes的生命周期绑定在一起。Rust会在函数退出时销毁bytes,这和返回的data显然冲突。
我找到的大多数同类问题的解决方案要么是修改Data(这不可能),要么是大幅重构周边代码,因为提问者都没搞清楚核心问题。
唯一真正解决问题的方案是Stack Overflow上的一个回答,我花了很大功夫才找到并确认它能解决我的问题。
代码示例
// 这段代码无法修改! pub struct Data<'a> { data: &'a mut [u8], } // 这段代码无法修改! impl Data<'_> { fn do_it(&mut self) { self.data[20] = 23; } } // 这段代码由我编写: fn test<'a>() -> Data<'a> { let mut bytes: Vec<u8> = vec!(0; 128); let mut data = Data { data: &mut bytes }; data.do_it(); /* 下面这行代码必然报错: data: &mut bytes ---------- `bytes` 在这里被借用 data ^^^^ 返回了一个引用当前函数拥有的数据的值 */ data }
内容的提问来源于stack exchange,提问作者Jan Diederich
相关产品推荐
相关产品推荐

