更高階別的特質界限
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*
特徵。
對於這些示例,生命週期省略工作正常,因此我們不必指定生命週期。