• 限定
    • 参见:

    限定

    就如泛型类型能够被限定一样,生命周期(它们本身就是泛型)也可以使用限定。: 字符的意义在这里稍微有些不同,不过 + 是相同的。注意下面是怎么说明的:

    1. T: 'a:在 T 中的所有引用都必须比生命周期 'a 活得更长。
    2. T: Trait + 'aT 类型必须实现 Trait trait,并且在 T 中的所有引用都必须比 'a 活得更长。

    下面例子展示了上述语法的实际应用:

    1. use std::fmt::Debug; // 用于限定的 trait。
    2. #[derive(Debug)]
    3. struct Ref<'a, T: 'a>(&'a T);
    4. // `Ref` 包含一个指向指向泛型类型 `T` 的引用,其中 `T` 拥有
    5. // 一个未知的生命周期 `'a`。`T` 是被限定的,从而在 `T` 中的
    6. // 任何**引用**都必须比 `'a` 活得更长。另外 `Ref` 的生命周期
    7. // 也不能超出 `'a`。
    8. // 一个泛型函数,使用 `Debug` trait 来打印内容。
    9. fn print<T>(t: T) where
    10. T: Debug {
    11. println!("`print`: t is {:?}", t);
    12. }
    13. // 这里接受一个指向 `T` 的引用,其中 `T` 实现了 `Debug` trait,
    14. // 并且在 `T` 中的所有引用都必须比函数存活时间更长。
    15. fn print_ref<'a, T>(t: &'a T) where
    16. T: Debug + 'a {
    17. println!("`print_ref`: t is {:?}", t);
    18. }
    19. fn main() {
    20. let x = 7;
    21. let ref_x = Ref(&x);
    22. print_ref(&ref_x);
    23. print(ref_x);
    24. }

    参见:

    泛型, 泛型中的限定, 以及
    泛型中的多重限定