首页 > 解决方案 > 函数调用中的生命周期参数有冲突的要求

问题描述

我有一个Screen结构,其中包含两个用于缓冲区的可变切片和一个用于画布的可变切片:

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

借用缓冲区的方法和一个方法交换并写入它们:

impl<'a> Screen<'a> {
    pub fn get_buf(&'a self) -> &[u32] {
        self.buffers[self.index].as_slice()
    }
    pub fn get_mut_buf(&mut self) -> &mut [u32] {
        self.buffers[self.index].as_mut_slice()
    }
    pub fn swap_buffers(&mut self) {
        self.canvas.copy_from_slice(self.get_buf());
        self.bufnum += 1;
        if self.bufnum == self.buffers.len() {
            self.bufnum = 0;
        }
    }
}

这里的问题是,正如在另一个线程中回答的那样(在一次借用切片的索引和结构的字段时无法推断正确的生命周期),编译器看不到self.buffersself.canvas不同的东西,所以我试图分配一个新的'b生命周期buffers,但它以某种方式导致它具有相互冲突的要求:

struct Screen<'a, 'b> {
    pub canvas: &'a mut [u32],
    pub buffers: [&'b mut [u32]; 2],
    pub bufnum: usize,
}

impl<'a, 'b> Screen<'a, 'b> {
    pub fn get_buf(&self) -> &'b [u32] {
        self.buffers[self.bufnum]
    }
    pub fn get_mut_buf(&mut self) -> &'b mut [u32] {
        &mut self.buffers[self.bufnum]
    }
    pub fn swap_buffers(&mut self) {
        self.canvas.copy_from_slice(self.get_buf());
        self.bufnum += 1;
        if self.bufnum == self.buffers.len() {
            self.bufnum = 0;
        }
    }
}

我怎样才能解决这个问题并且仍然能够使用get_butand get_mut_buf

标签: rust

解决方案


使用您的原始结构。

match self {
    Screen { index, buffers, index } => {
        // the parts are separate &mut references here
       ....
    }
}    

推荐阅读