rust - 函数调用中的生命周期参数有冲突的要求
问题描述
我有一个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.buffers
和self.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_but
and get_mut_buf
?
解决方案
使用您的原始结构。
match self {
Screen { index, buffers, index } => {
// the parts are separate &mut references here
....
}
}
推荐阅读
- css - 如何将文本子项包装在 flex 列中并保持列的宽度固定 - CSS?
- java - Spring JPA - 读取实体列表(只有部分属性)并更新值而不从数据库中选择整个对象?
- javascript - 如何将当前项目传递给 react-native 中的组件?
- android - 具有推送通知权限的空白 delphi FMX 应用程序在启动时崩溃
- r - R terra tif 导入颜色图
- quarkus - Mutiny Uni 转换为原始类型
- apache - 如果此子目录包含另一个 .htaccess,RewriteRule 会不必要地将请求重定向到 index.php,而不是按原样提供子目录
- c# - 我需要将图像文件上传和读取到不属于我的项目文件夹 Asp.NET MVC 5 的文件夹中。我的站点托管在 IIS 服务器中。任何想法?
- python - 获取所有可能的值组合
- flutter - 如何在 Flutter WEB 中上传文件到 API