reference - 生命周期不匹配 - 返回一个引用的可变变量
问题描述
我有不同形状的结构:
struct Triangle { points: Vec<u8> }
struct Square { points: Vec<u8> }
struct Pentagon { points: Vec<u8> }
我有一个特点CursorReadWrite
:
use std::io::Cursor;
pub trait CursorReadWrite {
fn mwrite(&mut self, writer: &mut Cursor<Vec<u8>>) -> &mut Cursor<Vec<u8>>;
fn mread(&mut self, reader: &mut Cursor<Vec<u8>>);
}
我可以实现它Triangle
,Square
等等
impl CursorReadWrite for Triangle {
fn mwrite(&mut self, writer: &mut Cursor<Vec<u8>>) -> &mut Cursor<Vec<u8>> {
//do some work and write the data on Cursor<>
writer.write(somedata);
return writer;
}
fn mread(&mut self, reader: &mut Cursor<Vec<u8>>) {
//read data and do some work and save it in mutable self ( Triangle, Square etc)
self.points = somedata;
}
}
像这样调用函数
let csd = Cursor::new(Vec::<u8>::new());
let mut t = Triangle::default();
let new_csd = t.mwrite(&mut csd);
t.mread(&mut new_csd);
它给出了这个错误
error[E0623]: lifetime mismatch
|
25 | fn mwrite(&mut self,writer: &mut Cursor<Vec<u8>>) -> &mut Cursor<Vec<u8>>{
| -------------------- ----------------------------
| |
| this parameter and the return type are declared with different lifetimes...
...
28 | return writer;
| ^^^^^^^^^^^^ ...but data from `writer` is returned here
解决方案
修复你的代码并不容易,因为有很多缺失的部分,但你可能想用显式的生命周期重新定义mwrite
:
pub trait CursorReadWrite<'a, 'b> {
fn mwrite(&'a mut self, writer: &'b mut Cursor<Vec<u8>>) -> &'b mut Cursor<Vec<u8>>;
fn mwread(&mut self, reader: &mut Cursor<Vec<u8>>);
}
impl<'a, 'b> CursorReadWrite<'a, 'b> for Triangle{
fn mwrite(&'a mut self, writer: &'b mut Cursor<Vec<u8>>) -> &'b mut Cursor<Vec<u8>>{
...
}
}
当您有超过 1 个输入生命周期时,编译器无法判断您要为输出选择哪一个。引用生命周期省略规则:
作为引用的每个参数都有自己的生命周期参数。换句话说,一个有一个参数的函数会得到一个生命周期参数: fn
foo<'a>(x: &'a i32)
,一个有两个参数的函数会得到两个独立的生命周期参数:fn foo<'a, 'b>(x: &'a i32, y: &'b i32)
,依此类推。(...)
如果有多个输入生命周期参数,但其中一个是
&self
或&mut self
因为这是一个方法,则将 self 的生命周期分配给所有输出生命周期参数。(...)
推荐阅读
- scala - 元组为零的 HList foldLeft
- assembly - MIPS 的 XOR 指令单周期数据路径
- amazon-web-services - 如果名称在 AWS SSM 参数中包含模式,则以编程方式搜索
- r - R ggplot2 - 将主题网格与轴刻度线对齐
- c# - 获取具有不同点数的一组曲线的平均曲线
- node.js - 在 AWS Lambda 后台运行任务
- python - 如何从不同的文件夹中读取图像数据?
- visual-studio - 您如何将 DbContext 搭建为预构建事件
- regex - 使用 .htaccess 在特定页面上设置标题
- r - 发现人群之间的差异