Функция Rust возвращает объект, содержащий ссылку на параметр, компилируется нормально, но не компилируется, когда & self включено в список параметров - PullRequest
0 голосов
/ 25 февраля 2020

Этот код компилируется нормально.

Foo содержит ссылку на объект типа X. У него есть простая функция new (), которая делает это. Затем есть функция с именем foo2 () (она также может быть свободной функцией вне блока impl), которая принимает ссылку на X и возвращает совершенно новый объект типа Foo. Это работает нормально.

Проблема в том, если я раскомментирую foo (), который включает параметр & self. Внезапно это не работает сейчас. Почему? Если я добавлю время жизни, то это сработает, но почему это не понять? Спасибо.

struct X {
}

struct Foo<'a> {
    x: &'a X
}

impl<'a> Foo<'a> {
    fn new(x: &'a X) -> Self {
        Self {
            x
        }
    }
}

struct B {
}

impl B {
    // This doesn't work
    /*fn foo(&self, x: &X) -> Foo {
        Foo::new(x)
    }*/

    // This does work
    fn foo2(x: &X) -> Foo {
        Foo::new(x)
    }
}

fn main() {
    let x = X {};
    let b = B {};
    //let f = b.foo(&x);
}

Но когда я раскомментирую foo (), я получаю эту ошибку:

error[E0623]: lifetime mismatch
  --> main.rs:21:9
   |
20 |     fn foo<'a>(&self, x: &'a X) -> Foo {
   |                          -----     ---
   |                          |
   |                          this parameter and the return type are declared with different
 lifetimes...
21 |         Foo::new(x)
   |         ^^^^^^^^^^^ ...but data from `x` is returned here

Есть ли здесь какой-то эллисон, который и сам портится? Что тут происходит? Спасибо

Это работает:

fn foo<'a>(&self, x: &'a X) -> Foo<'a> {
    Foo::new(x)
}

Но почему компилятор этого не понимает?

1 Ответ

2 голосов
/ 25 февраля 2020

Ссылка на ржавчину -> Срок службы elision

Если получатель имеет тип & Self или & mut Self, то время жизни этой ссылки на Self назначается для всех жизненных циклов elided output параметры.

Существует причина, по которой компилятор пытается получить lifeteime из &self, а не из x: &X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...