Avatar ·

`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`,而有时又不会? 感谢解答!