更高级别的特质界限

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*特征。

对于这些示例,生命周期省略工作正常,因此我们不必指定生命周期。