несоответствие времени жизни - возвращает изменяемую переменную, на которую ссылаются - PullRequest
0 голосов
/ 08 мая 2018

У меня есть структуры различной формы:

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

1 Ответ

0 голосов
/ 08 мая 2018

Исправить код нелегко, потому что пропущено много кусочков, но вы можете переопределить 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, так как это метод, тогда время жизни себя присваивается всем параметрам времени жизни на выходе . (...)

...