更高级别的特质界限
fn copy_if<F>(slice: &[i32], pred: F) -> Vec<i32>
where for<'a> F: Fn(&'a i32) -> bool
{
let mut result = vec![];
for &element in slice {
if pred(&element) {
result.push(element);
}
}
result
}
这指定 Fn
特征界限中 i32 上的引用可以具有任何生命周期。
以下不起作用:
fn wrong_copy_if<'a, F>(slice: &[i32], pred: F) -> Vec<i32>
where F: Fn(&'a i32) -> bool
{ // <----------------+
let mut result = vec![]; // 'a scope |
for &element in slice { // <--------+ |
if pred(&element) { // | |
result.push(element); // element's| |
} // scope | |
} // <--------+ |
result // |
} // <----------------+
编译器给出以下错误:
error: `element` does not live long enough
if pred(&element) { // | |
^~~~~~~
因为 element
局部变量不会像'a
生命周期那样存在(我们可以从代码的注释中看到)。
生命周期不能在函数级别声明,因为我们需要另一个生命周期。这就是为什么我们使用 for<'a>
:指定引用可以在任何生命周期内有效(因此可以使用更小的生命周期)。
更高级别的特征边界也可用于结构:
struct Window<F>
where for<'a> F: FnOnce(&'a Window<F>)
{
on_close: F,
}
以及其他项目。
更高等级的特质边界最常用于 Fn*
特征。
对于这些示例,生命周期省略工作正常,因此我们不必指定生命周期。