向返回隐式特性的函数添加泛型类型需要使用“静态生存期”

时间:2018-12-15 17:51:02

标签: rust traits lifetime

我有一个函数,将引用作为参数并返回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的参数应该是“静态的?

Playground link

返回的future的生存期为'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本身有关,而不是与生命周期选择的任何最新变化有关。在我看来,返回类型正在捕获它不应该捕获的生存期边界。

0 个答案:

没有答案