如何在结构体中填充缓冲区并同时显示它

问题描述 投票:0回答:1

Rust 开发人员您好,

我是 Rust 新手,我遇到了缓冲区寿命的问题。

我希望我的主程序负责填充一个结构体和一个缓冲区。 我的结构必须在“无限”循环中填充缓冲区。 对于循环的每次迭代,我想打印缓冲区内容。像这样的东西:

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;
        }
    }
}

从错误消息“不能借用

buffer
作为不可变的,因为它也被借用为可变的”以及类似的事情,这取决于我的测试和 Rust 文档,我明白问题来自于我在调用 fill_buffer 之后显示缓冲区。 fill_buffer 使用引用,这似乎对 rust 调用它并在同一范围内获取值造成了问题。

任何人都可以解释一下如何有一个无限循环来调用结构上的填充缓冲区并在之后显示它吗?我还希望 main 负责创建缓冲区。我希望缓冲区位于结构体中,而不是作为参数传递给 fill_buffer。

rust lifetime
1个回答
0
投票

您已通过持有可变引用向 buffer 授予

obj
独占
访问权限,因此
main()
无法访问
buffer
,而
obj
拥有它。

我看到两个选项:

  • 在循环的每次迭代中重新创建

    obj
    ,因此在最后打印之前它可能会被销毁(释放其独占访问权限),或者

  • 借回缓冲区:

    impl<'a> MyObject<'a> {
        fn buffer(&self) -> &[f64] {
            self.buffer
        }
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.