Reference 生存期不匹配-返回引用的可变变量
我有不同形状的结构:Reference 生存期不匹配-返回引用的可变变量,reference,rust,immutability,lifetime,Reference,Rust,Immutability,Lifetime,我有不同形状的结构: struct Triangle { points: Vec<u8> } struct Square { points: Vec<u8> } struct Pentagon { points: Vec<u8> } 我可以为三角形,正方形等实现它 impl CursorReadWrite for Triangle { fn mwrite(&mut self, writer: &mut Cursor<Vec&
struct Triangle { points: Vec<u8> }
struct Square { points: Vec<u8> }
struct Pentagon { points: Vec<u8> }
我可以为三角形
,正方形
等实现它
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;
}
}
impl CursorReadWrite for Triangle{
fn mwrite(&mut self,writer:&mut Cursor)->&mut Cursor{
//做一些工作,把数据写在游标上
writer.write(一些数据);
返回作者;
}
fn mread(&mut self,读卡器:&mut Cursor){
//读取数据并做一些工作,然后将其保存在可变的self中(三角形、正方形等)
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);
let csd=Cursor::new(Vec:::new());
设mut t=Triangle::default();
让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
错误[E0623]:生存期不匹配
|
25 | fn mwrite(&mut self,writer:&mut Cursor)->&mut Cursor{
| -------------------- ----------------------------
| |
|此参数和返回类型使用不同的生存期声明。。。
...
28 |返回作者;
|^^^^^^^^^^^^^……但是这里返回了来自“writer”的数据
修复代码并不容易,因为有很多缺失的部分,但您可能希望使用显式生命周期重新定义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>>{
...
}
}
pub trait CursorReadWrite{
fn mwrite(&'a mut self,writer:&'b mut Cursor)->&'b mut Cursor;
fn mwread(&mut self,读卡器:&mut Cursor);
}
三角形的impl CursorReadWrite{
fn mwrite(&'a mut self,writer:&'b mut Cursor)->&'b mut Cursor{
...
}
}
当您有超过1个输入生存期时,编译器无法判断您要为输出选择哪一个。引用:
参数:FN<代码> WimeFieTimes 101:了解您。考虑将所有生命周期扩展为<代码> MyOrth>代码>作为一个练习。为什么返回一个被传递到函数中的引用?无论如何它应该在外部范围内可用……这个代码中还有其他多个问题:函数的末尾不需要<代码>返回<代码>。st删除分号;
writer的结果。write
被故意忽略,这可能会触发编译器警告。mwread
甚至不包含可复制的实现。强烈建议您下次编写正确的代码。您的代码无效。例如,它缺少struct
关键字。It生成错误(方法`mwread`不是trait`CursorReadWrite`
的成员,在此范围内找不到值`somedata`
),等等。请查看如何创建和您的问题以包含它。
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>>{
...
}
}