У меня есть функция, которая принимает ссылки в качестве параметров и возвращает impl Future
.Будущее не относится к параметрам (требуется копия), поэтому ссылки не должны переживать вызов функции:
use futures::{Future, future}; // 0.1.25
pub struct Point<'a> {
_name: &'a str,
}
pub fn write<'a>(_points: &'a [Point<'a>]) -> impl Future<Item = (), Error = ()> + 'static {
future::ok(())
}
pub fn call_write(points: Vec<Point>) -> impl Future<Item = (), Error = ()> {
// this works fine
write(&points)
}
Я бы хотел адаптировать мою функцию write
, чтобы онаобщий аргумент, но когда я делаю это, компилятор думает, что моя функция занимает время жизни 'static
, а не 'a
:
pub fn write<'a, T: 'a>(_points: &'a [T]) -> impl Future<Item = (), Error = ()> + 'static {
future::ok(())
}
error[E0621]: explicit lifetime required in the type of `points`
--> src/lib.rs:11:42
|
11 | pub fn call_write(points: Vec<Point>) -> impl Future<Item = (), Error = ()> {
| ---------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'static` required
| |
| help: add explicit lifetime `'static` to the type of `points`: `std::vec::Vec<Point<'static>>`
Моя write
функция не ведет себя по-другому суниверсальный T
как и Point
, так почему компилятор считает, что параметр универсального write
должен быть «статическим»
ссылка на игровую площадку
возвращенное будущее имеет время жизни 'static
, поскольку оно не содержит ссылок на исходные параметры.В реальном коде параметры сериализуются в Vec<u8>
, который принадлежит будущему.
Замена impl Future + 'static
на Box<dyn Future + 'static>
работает, поэтому я смотрю на ограничение impl Trait
?
pub fn write<'a, T: 'a>(_points: &'a [T]) -> Box<dyn Future<Item = (), Error = ()> + 'static> {
Ошибка до и после 1.30 одинакова, поэтому я думаю, что это должно быть связано с самой Impl Trait, а не с каким-либо недавним изменением жизненного уровня.Мне кажется, что возвращаемый тип захватывает границы времени жизни, которые он не должен.