У меня есть структура с временем жизни:
struct HasLifetime<'a>( /* ... */ );
Существует реализация черты Foo
:
impl<'a, 'b: 'a> Foo for &'a mut HasLifetime<'b> { }
Я хочу реализовать следующую функцию:
fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> impl Foo {
bar
}
Это не скомпилируется, потому что возвращенный impl
действителен только для 'a
.Однако, указав impl Foo + 'a
, вы получите:
error[E0909]: hidden type for `impl Trait` captures lifetime that does not appear in bounds
--> src/main.rs:7:60
|
7 | fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut HasLifetime<'b>) -> impl Trait + 'a {
| ^^^^^^^^^^^^^^^
|
note: hidden type `&'a mut HasLifetime<'b>` captures the lifetime 'b as defined on the function body at 7:1
--> src/main.rs:7:1
|
7 | fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut HasLifetime<'b>) -> impl Trait + 'a {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Компиляция, по-видимому эквивалентная функции с объектом в штучной упаковке:
fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> Box<Foo + 'a> {
Box::new(bar)
}
Как определить bar_to_foo
с помощью impl Trait
?
ссылка на игровую площадку