`for<>`(Higher-Ranked Trait Bounds)语法与 Rust 中普通生命周期约束有何不同?
大家好!我写 Rust 已经几个月了,但在生命周期的复杂问题上仍然感到困惑。最近我遇到了 `for<'a>` 语法,不明白它与普通生命周期约束有何区别。
下面是一个让我困惑的例子。我有一个函数,它接受一个能处理任意生命周期的闭包:
```rust
fn example(f: F)
where
F: Fn(&str) -> &str
{
let s = String::from("hello");
println!("{}", f(&s));
}
```
但如果我尝试传递一个返回参数引用的闭包,一切正常。而如果我希望闭包接受任意生命周期的引用,我在文档中看到这样的语法:
```rust
fn example(f: F)
where
F: for<'a> Fn(&'a str) -> &'a str
{
// ...
}
```
区别是什么?什么时候该用 `for<>`,什么时候该用普通的 lifetime 参数?为什么编译器有时会报错,如果我只写 `Fn(&str) -> &str`,而有时又不会?
感谢解答!