Добавление универсального типа в функцию, которая возвращает impl Trait, требует использования «статического времени жизни». - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть функция, которая принимает ссылки в качестве параметров и возвращает 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, а не с каким-либо недавним изменением жизненного уровня.Мне кажется, что возвращаемый тип захватывает границы времени жизни, которые он не должен.

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