我正在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/