P.GEN.05 定义泛型函数时,如果该函数实现用到来自 trait 定义的相关行为,需要为泛型指定相关 trait 的限定
【描述】
泛型,在 Rust 类型系统中的语义是一种 通用量化类型(Universally-quantified type),即,泛型类型 T
的所有可能 的单态类型。
在泛型函数内部,如果使用了来自某个 trait 定义的行为,则需要为泛型指定相关的 trait 限定,来排除其他没有实现该trait 的类型。
注:Rust编译器可以检测这种情况,但是编译错误比较晦涩,本原则用来提示开发者注意这种情况。
【反例】
#![allow(unused)] fn main() { use std::fmt; // println! 中 `{:?}` 为 Debug triat 定义行为 fn some_func<T>(foo: T) { println!("{:?}", foo); // error[E0277]: `T` doesn't implement `Debug` } }
【正例】
use std::fmt; // 为泛型类型 T 指派 Debug triat 限定 fn some_func<T: fmt::Debug>(foo: T) { println!("{:?}", foo); } struct A; fn main() { some_func(5i32); // A 没有实现 Debug trait,会被排除掉 some_func(A); // error[E0277]: `A` doesn't implement `Debug` }