闭包和更高级别的特质限制了生命周期问题



我正在试验排名更高的特质界限。在我创建的一个最小的例子中,有一个函数接受一个闭包,它接受一个&str,并返回一个具有相同生存期的&str 'a。我明确声明了Fn特性的寿命。

fn foo(_: &for<'a> Fn(&'a str) -> &'a str) {
}
fn main() {
    foo(&|s| s);
}

这很好用。如果我将闭包中参数的类型注释为&str类型,我将收到一个终生错误:

fn foo(_: &for<'a> Fn(&'a str) -> &'a str) {
}
fn main() {
    foo(&|s: &str| s); // explicitly specified parameter type
}

这让我很困惑。原因有几个。

  • 闭包的返回类型不是被推断为与参数(通过寿命省略具有相同的寿命)
  • foo的论点在所有可能的情况下都是唯一量化的寿命。为什么生命周期的类型不能是任意的?不是吗'a只是一个终生的占位符

它可以在不显式指定类型的情况下工作,但为什么呢?那两个版本有何不同?

playpen代码

在当前版本的Rust中,编译时没有警告:

fn foo<T>(_: &T) where
T: for<'a> Fn(&'a str) -> &'a str
{
}
fn main() {
    foo(&|s: &str| s); // explicitly specified parameter type
}

最新更新