我有一个函数,将引用作为参数并返回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
的参数应该是“静态的?
返回的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本身有关,而不是与生命周期选择的任何最新变化有关。在我看来,返回类型正在捕获它不应该捕获的生存期边界。