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>>{
            ...
        }
    }