关闭和更高级别的特征 - 边界生命周期问题

jte*_*epe 10 rust

我正在尝试更高级别的特质界限.在我创建的一个最小的例子中,有一个函数采用一个闭包,它接受&str并返回&str相同的生命周期'a.我明确宣布了生命的Fn特征.

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

fn main() {
    foo(&|s| s);
}
Run Code Online (Sandbox Code Playgroud)

这很好用.如果我在闭包中注释参数的类型是类型&str,我收到一个生命周期错误:

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

fn main() {
    foo(&|s: &str| s); // explicitly specified parameter type
}
Run Code Online (Sandbox Code Playgroud)

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

  • 闭包的返回类型是否与参数的类型相同(通过生命周期省略具有相同的生命周期)?
  • 这个论点foo在所有可能的生命周期中都是无法量化的.为什么生命的类型不能随意?是不是 'a只是一辈子的占位符?

它没有明确指定类型,但为什么?这两个版本有何不同?

围栏代码

Ang*_*ros 1

在 Rust 的当前版本中,编译时不会出现警告:

fn foo<T>(_: &T) where
T: for<'a> Fn(&'a str) -> &'a str
{
}

fn main() {
    foo(&|s: &str| s); // explicitly specified parameter type
}
Run Code Online (Sandbox Code Playgroud)