如何在Rust结构体中填充buffer并同时显示其内容?
处理Buffer生命周期的Rust问题
需求场景
我需要实现这样的逻辑:主程序负责创建结构体和buffer,结构体在循环中填充buffer,每次循环完成后打印buffer的内容。最初的代码实现如下:
主程序代码
fn main() { let mut buffer = [0.0; 1024]; let mut obj = MyObject::new(&mut buffer); loop { obj.fill_buffer(); for i in 0..1024 { println!("Sample {}: {}", i, buffer[i]); } } }
结构体定义
struct MyObject<'a> { a_value: f64, buffer: &'a mut [f64], } impl<'a> MyObject<'a> { fn new(buffer: &'a mut [f64]) -> MyObject<'a> { MyObject { a_value: 1.0, buffer: buffer } } fn fill_buffer(&mut self) { for i in 0..self.buffer.len() { self.buffer[i] = 1.0; } } }
问题分析
编译时收到错误提示:cannot borrow buffer as immutable because it is also borrowed as mutable。结合Rust的借用规则可知,问题出在调用fill_buffer后直接访问buffer:结构体MyObject持有了buffer的可变引用,在同一作用域下,Rust不允许同时存在对buffer的可变借用和不可变借用。
解决方案
调整fill_buffer方法,让它在完成填充后返回buffer的不可变引用。这样在循环中,我们通过这个返回的引用来访问buffer,借用检查器能正确识别可变借用的生命周期已经结束,允许使用不可变引用访问内容。
修正后的代码
struct MyObject<'a> { a_value: i64, buffer: &'a mut [f64], } impl<'a> MyObject<'a> { fn new(buffer: &'a mut [f64]) -> MyObject<'a> { MyObject { a_value: 0, buffer: buffer } } fn fill_buffer(&mut self) -> &[f64] { for i in 0..self.buffer.len() { self.buffer[i] = i as f64 * self.a_value as f64; } self.buffer } } fn main() { let mut buffer = [0.0; 8]; let mut obj = MyObject::new(&mut buffer); for i in 1..9 { obj.a_value = i; let buffer = obj.fill_buffer(); for j in 0..8 { println!("Loop {}: subloop: {}: sample {}", i, j, buffer[j]); } } }
内容的提问来源于stack exchange,提问作者Régis Ramillien
相关产品推荐
相关产品推荐

