我对缓冲器的生命周期 有困难.
我希望我的主程序负责填充 struct 和缓冲区. 我的 struct 体在"无限"循环中填充缓冲区. 对于循环的每次迭代,我都想打印缓冲区内容.类似于这样的:
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 看起来像这样:
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;
}
}
}
从错误消息"无法borrow buffer
作为不可变,因为它也被borrow 为可变"以及类似的事情(取决于我的测试和rust文档)中,我了解到问题来自于我在调用fill_buffer
后显示缓冲区.
fill_buffer
使用引用,在同一范围内调用它并获取值似乎会带来问题.
我怎样才能有一个无限循环,在 struct 上调用fill_buffer
并在之后显示它?我希望main
负责创建缓冲区.我希望缓冲区位于 struct 中,而不是作为参数传递给fill_buffer
.
100
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]);
}
}
}