我对缓冲器的生命周期 有困难.

我希望我的主程序负责填充 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]);
        }
    }
}

推荐答案

您通过持有可变引用赋予exclusive bufferobj的访问权限,因此main()无法访问buffer,而obj拥有它.

我看到两种 Select :

  • 在循环的每次迭代上重新创建obj,因此它可能会在结束打印之前被销毁(释放其独占访问权限),或者

  • 借回缓冲区:

    impl<'a> MyObject<'a> {
        fn buffer(&self) -> &[f64] {
            self.buffer
        }
    }
    

Rust相关问答推荐

收集RangeInclusive T到Vec T<><>

将内部类型作为参数的泛型 struct 上的方法

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

函数内模块的父作用域的访问类型

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

我无法理解Rust范围的定义(Rust Programming Language,第二版克拉布尼克和尼科尔斯)

循环访问枚举中的不同集合

更合理的方法来设计样条线函数器?

不同类型泛型的映射

这是什么:`impl Trait for T {}`?

为什么将易错函数的泛型结果作为泛型参数传递 infer ()?不应该是暧昧的吗?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

try 从标准输入获取用户名和密码并删除 \r\n

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

部署Rust发布二进制文件的先决条件

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

我什么时候应该使用特征作为 Rust 的类型?

将 Futures 的生命周期特征绑定到 fn 参数

在 FFI 的上下文中,未初始化是什么意思?