境界
ジェネリック型を境界付けできるのと同様に、(それ自体がジェネリックである) ライフタイムも境界を使用します。ここでは : 文字の意味が少し異なりますが、 + は同じです。以下をどのように読むかに注目してください:
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` は、`Ref` には分からない何らかのライフタイム `'a` を持つ // ジェネリック型 `T` への参照を含みます。`T` は、`T` 内のあらゆる // *参照* が `'a` より長く生存しなければならないように境界付けされています。 // さらに、`Ref` のライフタイムは `'a` を超えてはなりません。 // `Debug` トレイトを使って出力するジェネリック関数。 fn print<T>(t: T) where T: Debug { println!("`print`: t は {:?}", t); } // ここでは、`T` が `Debug` を実装し、`T` 内のすべての *参照* が // `'a` より長く生存する場合に、`T` への参照が取得されます。さらに、 // `'a` はこの関数より長く生存しなければなりません。 fn print_ref<'a, T>(t: &'a T) where T: Debug + 'a { println!("`print_ref`: t は {:?}", t); } fn main() { let x = 7; let ref_x = Ref(&x); print_ref(&ref_x); print(ref_x); }