rust - 一次借用切片的索引和结构的字段时无法推断正确的生存期

标签 rust

我正在Rust中实现一个双缓冲区,所以当我得到当前缓冲区时,它会执行self.buffers[self.index]
为了简洁起见,我将其设置为一个函数,因此可以这样称呼它:

pub struct Screen<'a> {
    pub canvas: Canvas<'a>,
    pub buffers: [Vec<u32>; 2],
    pub index: usize,
}

impl<'a> Screen<'a> {
    #[inline(always)]
    pub fn get_buf<'b>(&'a self) -> &[u32] {
        self.buffers[self.index].as_slice()
    }
    #[inline(always)]
    pub fn get_mut_buf<'b>(&mut self) -> &mut [u32] {
        self.buffers[self.index].as_mut_slice()
    }
    pub fn clear(&mut self, color: u32) {
        for pixel in self.get_mut_buf().iter_mut() {
            *pixel = color;
        }
    }
    pub fn swap_buffers(&mut self) {
        self.canvas.data.copy_from_slice(&self.buffers[self.index]);
        self.index += 1;
        if self.index >= self.buffers.len() {
            self.index = 0;
        }
    }
}
问题是这是无效的:
pub fn swap_buffers(&mut self) {
    self.canvas.data.copy_from_slice(self.get_buf());
    self.index += 1;
    if self.index >= self.buffers.len() {
        self.index = 0;
    }
}
虽然不是:
pub fn swap_buffers(&mut self) {
    self.canvas.data.copy_from_slice(&self.buffers[self.index]);
    self.index += 1;
    if self.index >= self.buffers.len() {
        self.index = 0;
    }
}
有一个更好的方法吗?
我什至尝试将实际缓冲区封装在一个结构(在本例中为Canvas)中,因为我看到了一个可以有所帮助的地方,因为借用字段而不是整个结构都可以解决此类问题。

最佳答案

在Rust中,您不能同时引用同一事物的可变引用和不可变引用。在here书中对此进行了很好的描述。
基本上,在第二种情况下,编译器能够看到.canvas.buffers是不同的东西。
在第一种情况下,get_buf返回一个&[u32]引用,该引用具有与&self相同的生存期,这意味着在调用self.get_buf()时,它将对整个Screen结构采用不变的引用。编译器不允许您对.canvas进行可变引用,因为它是self的一部分,并且您已经在使用对self的不可变引用。

关于rust - 一次借用切片的索引和结构的字段时无法推断正确的生存期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63946390/

相关文章:

rust - 错误: `cannot find attribute in this scope` when using custom proc_macro with attributes written with darling in rust

rust - 从 Ref 计数的 Vec 克隆到对象的 vec

rust - 跨多个异步调用超时的最佳方法?

arrays - 如何在 Rust 中默认初始化包含数组的结构?

hash - 如何使用实现 sha2 crate 中的 Digest 特征的类型(例如 Sha256)对结构进行哈希处理?

macros - 有哪些类型的宏/语法扩展/编译器插件?

c++ - 哪种方法在Rust中存储 `uint8_t*` C缓冲区是更安全的方法?

caching - 是否可以配置 Cargo 缓存它下载的 crate 的目录?

rust - 为什么编译器不推断 impl 特征返回值的关联类型的具体类型?

rust - 我可以在返回 never 类型 (!) 的发散函数中使用问号运算符 (?) 吗?