Rust:在无限循环中借用检查器

标签 rust infinite-loop borrow-checker

我目前正在构建一个带有主循环的应用程序。设置作为引用添加到结构中以避免装箱。问题是,即使看起来完全有效,借用检查器也不会验证无限循环。例如,这不会编译:

struct Demo<'a> {
    data: Vec<&'a u8>,
}

impl<'a> Demo<'a> {
    fn new(data: Vec<&'a u8>) -> Self {
        Demo { data }
    }

    fn bug(mut self) -> ! {
        let a = 8;
        {
            self.data.push(&a);
            {
                self.forever();
            }
        }
    }

    fn forever(self) -> ! {
        loop {
            for dat in &self.data {
                println!("{}", dat);
            }
        }
    }
}

fn main() {
    let v = vec![&1, &1, &2, &3];
    Demo::new(v).bug();
}

我的问题是:我如何重构上面的代码以避免装箱数据,但仍然能够使用主循环。

最佳答案

impl<'a> Demo<'a> 内, 所有 self s 具有完全相同的类型,对于完全相同的 'a .但就您而言,您正试图缩短使用生命周期。您可以通过重新绑定(bind) self 来完成此操作:

let mut this = self;
// the compiler infers that `this` must have a shorter lifetime:
this.data.push(&a);
this.forever();

( link to the playground )

您的其他示例可以在 similar way 中修复.

关于Rust:在无限循环中借用检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872440/

相关文章:

recursion - 使用可变引用对app_state进行递归更新更新

iterator - 在 Rust 中迭代切片的值而不是引用?

rust - 将集合移出上下文

c++ - 使用 continue 无限循环

javascript - 带重定向路由的 Vue-Router 无限循环

java - 如何中断无限循环

rust - 结构方法: Cannot borrow as mutable because it is also borrowed as immutable

generics - "borrowed value does not live long enough"具有返回 impl 特征的通用函数

rust - 如何在 Vec 中存储引用并稍后在 Rust 中使用它?

rust - 有没有办法从闭包内部的函数返回?