首页 > 解决方案 > 生命周期不匹配 - 返回一个引用的可变变量

问题描述

我有不同形状的结构:

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>>);
}

我可以实现它TriangleSquare等等

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

标签: referencerustimmutabilitylifetime

解决方案


修复你的代码并不容易,因为有很多缺失的部分,但你可能想用显式的生命周期重新定义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 个输入生命周期时,编译器无法判断您要为输出选择哪一个。引用生命周期省略规则

  1. 作为引用的每个参数都有自己的生命周期参数。换句话说,一个有一个参数的函数会得到一个生命周期参数: fn foo<'a>(x: &'a i32)一个有两个参数的函数会得到两个独立的生命周期参数: fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。

  2. (...)

  3. 如果有多个输入生命周期参数,但其中一个是&self&mut self因为这是一个方法,则将 self 的生命周期分配给所有输出生命周期参数。(...)


推荐阅读