更高階別的特質界限

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

對於這些示例,生命週期省略工作正常,因此我們不必指定生命週期。