特征约束

就像泛型类型可以有约束一样,生命周期也可以有约束 ,如下所示:

T: 'a ,所有引用在 T 必须超过生命周期 'a

T: Trait + 'a : T 必须实现特征 Trait 并且所有引用在 T 必须超过生命周期 'a

示例

use std::fmt::Debug; // 特 征 约 束 使 用

#[derive(Debug)]

struct Ref<'a, T: 'a>(&'a T);

// `Ref` 包 含 对 泛 型 类 型 `T` 的 引 用 , 该 泛 型 类 型 具 有

// 未 知 的 生 命 周 期 `'a`. `T` 是 约 定 任 何

// 引 用 在 `T` 必 须 大 于 `'a` 。 此 外 , 在 生 命 周 期

// 里 `Ref` 不 能 超 过 `'a`。

// 使 用 `Debug` 特 征 打 印 的 通 用 函 数 。

fn print<T>(t: T) where

T: Debug {

println!("`print`: t is {:?}", t);

}

// 这 里 引 用 `T` 使 用 where `T` 实 现

// `Debug` 和 所 有 引 用 `T` 都 要 比 `'a` 长

// 此 外 ,`'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);

}

1. 🌟

/* 使 用 生 命 周 期 注 释 结 构 体

1. `r` 和 `s` 必 须 是 不 同 生 命 周 期

2. `s` 的 生 命 周 期 需 要 大 于 'r'

*/

struct DoubleRef<T> {

r: &T,

s: &T

}

fn main() {

println!("Success!")

}

2. 🌟🌟

/* 添 加 类 型 约 束 使 下 面 代 码 正 常 运 行 */

struct ImportantExcerpt<'a> {

part: &'a str,

}

impl<'a, 'b> ImportantExcerpt<'a> {

fn announce_and_return_part(&'a self, announcement: &'b str) -> &'b str {

println!("Attention please: {}", announcement);

self.part

}

}

fn main() {

println!("Success!")

}

3. 🌟🌟

/* 添 加 类 型 约 束 使 下 面 代 码 正 常 运 行 */

fn f<'a, 'b>(x: &'a i32, mut y: &'b i32) {

y = x;

let r: &'b &'a i32 = &&0;

}

fn main() {

println!("Success!")

}