我正在试验排名更高的特质界限。在我创建的一个最小的例子中,有一个函数接受一个闭包,它接受一个&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
}