如何指定一个带引用的闭包,并返回实现与引用具有相同生命周期的特征的任何类型?

时间:2018-01-20 10:38:51

标签: rust

我需要告诉编译器F返回一些实现SomeTrait且生命周期为'a的内容:

trait SomeTrait {}

fn foo<P, Q, F>(func: F)
where
    Q: SomeTrait,
    F: for<'a> Fn(&'a P) -> Q + 'a,
{}

但是我收到了这个错误:

error[E0261]: use of undeclared lifetime name `'a`
 --> src/main.rs:6:33
  |
6 |     F: for<'a> Fn(&'a P) -> Q + 'a,
  |                                 ^^ undeclared lifetime

就像它不理解Q + 'a

2 个答案:

答案 0 :(得分:4)

Q不是特质,它是一种类型;像T: Q + 'a这样的东西没有意义。

如果你尝试F: for<'a> Fn(&'a P) -> (Q + 'a),你会得到:

error[E0404]: expected trait, found type parameter `Q`

您的示例实际上像F: (for<'a> Fn(&'a P) -> Q) + 'a一样进行解析 - 并且很明显为什么这样做不起作用。

现在:

  

我需要告诉编译器F返回一些实现SomeTrait生命周期为'a的内容。

除了使用参考或通用生命周期参数的生命周期之外,您的函数不能返回不同类型,具体取决于(传递)生命周期。你可以编写一个完全忽略生命周期的Rust编译器,如果原始程序有效,它仍会做同样的事情。

对于生命周期或类型,无法指定采用泛型参数的类型参数。

如果有,它可能看起来像这样:

trait SomeTrait {}

fn foo<P, for<'a> Q<'a>, F>(func: F)
where
    for<'a> Q<'a>: SomeTrait,
    for<'a> F: Fn(&'a P) -> Q<'a>,
{
}

答案 1 :(得分:1)

生命周期只能提供给引用。将行更改为有效:

F: for<'a> Fn(&'a P) -> &'a Q

一个对象本身并没有“生命周期” - 它一直存在直到它被删除。但是,借用检查器必须被告知参考对象相对于其他引用对象指向生命的时间长度。 那是的生命时代。