ライフタイムの境界
ジェネリックに境界が設定できたように、ライフタイム(これもジェネリックです)
にも境界が使えます。:はここでは違った意味を持ちますが、+は同じ意味です。
以下の注意を読んでください。
T: 'a:Tのすべての参照が'aより長生きする必要がある。T: Trait + 'a: 型TはTraitトレイトを実装している必要があり、Tの すべての参照が'aより長生きする必要がある。
下の例ではwhere節を使って上のことを表現しています。
use std::fmt::Debug; // 境界として設定するトレイト #[derive(Debug)] struct Ref<'a, T: 'a>(&'a T); // `Ref`はジェネリック型`T`への参照を持ち、それは未知のライフタイム`'a` // を持ちます。`T`は`T`のすべての*参照*が`'a`より長生きする必要があり、 // `Ref`のライフタイムは`'a`を超えられません。 // `Debug`トレイトを持つジェネリック型`T`をプリントする関数 fn print<T>(t: T) where T: Debug { println!("`print`: t is {:?}", t); } // `Debug`を実装し、`T`すべての参照が`'a`より長生きするような // ジェネリック型`T`の参照をとります。さらに、`'a`は関数より // 長生きする必要があります。 fn print_ref<'a, T>(t: &'a T) where T: Debug + 'a { println!("`print_ref`: t is {:?}", t); } fn main() { let x = 7; let ref_x = Ref(&x); print_ref(&ref_x); print(ref_x); }