我正在尝试更高级别的特征界限。在我创建的一个最小示例中,有一个函数采用闭包,它采用 &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 code
最佳答案
在当前版本的 Rust 编译时没有警告:
fn foo<T>(_: &T) where
T: for<'a> Fn(&'a str) -> &'a str
{
}
fn main() {
foo(&|s: &str| s); // explicitly specified parameter type
}
关于rust - 闭包和 Higher-Ranked-Trait-Bounds 生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364403/