特征约束
就像泛型类型可以有约束一样,生命周期也可以有约束 ,如下所示:
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!")
}