Этот код компилируется нормально.
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)
}
Но почему компилятор этого не понимает?