# Chap 10. 泛型 ## [10.1: 泛型数据类型](../examples/generic.rs) ## [10.2: trait: 定义共享的行为](../examples/trait_test.rs) ## [10.3: 泛型生命周期](../examples/generic_lifetime.rs) 生命周期省略规则(lifetime elision rules): > 被编码进 Rust 引用分析的模式被称为。这并不是需要程序员遵守的规则;这些规则是一系列特定的场景,此时编译器会考虑,如果代码符合这些场景,就无需明确指定生命周期。 省略规则并不提供完整的推断:如果 Rust 在明确遵守这些规则的前提下变量的生命周期仍然是模棱两可的话,它不会猜测剩余引用的生命周期应该是什么。编译器会在可以通过增加生命周期注解来解决错误问题的地方给出一个错误提示,而不是进行推断或猜测。 函数或方法的参数的生命周期被称为 输入生命周期(input lifetimes),而返回值的生命周期被称为 输出生命周期(output lifetimes)。 编译器采用三条规则来判断引用何时不需要明确的注解。第一条规则适用于输入生命周期,后两条规则适用于输出生命周期。如果编译器检查完这三条规则后仍然存在没有计算出生命周期的引用,编译器将会停止并生成错误。这些规则适用于 fn 定义,以及 impl 块。 1. 第一条规则是编译器为每一个引用参数都分配一个生命周期参数; >换句话说就是,函数有一个引用参数的就有一个生命周期参数:fn foo<'a>(x: &'a i32),有两个引用参数的函数就有两个不同的生命周期参数,fn foo<'a, 'b>(x: &'a i32, y: &'b i32),依此类推。 2. 第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数; >fn foo<'a>(x: &'a i32) -> &'a i32 3. 第三条规则是如果方法有多个输入生命周期参数并且其中一个参数是 &self 或 &mut self,说明是个对象的方法 (method),那么所有输出生命周期参数被赋予 self 的生命周期; >第三条规则使得方法更容易读写,因为只需更少的符号。