Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

境界

ジェネリック型を境界付けできるのと同様に、(それ自体がジェネリックである) ライフタイムも境界を使用します。ここでは : 文字の意味が少し異なりますが、 + は同じです。以下をどのように読むかに注目してください:

  1. T: 'a: T 内の_すべての_参照は、ライフタイム 'a より長く生存しなければなりません。
  2. 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);
}

関連項目:

ジェネリクスジェネリクスにおける境界、および ジェネリクスにおける複数の境界