泛型允许在程序中包含使用调用(实例化)时才确定的类型,这样就可以将不同类型具有相同功能的代码抽象在一个方法中。
结构体和枚举中的泛型
标准库中的泛型
enum Option<T> {
Some(T),
None,
}
泛型可以有默认值,如下实例化Default时如果不指定T的类型,那它就是i32类型,否则通过::<>
指定类型。
struct Default<T=i32> {
value: T
}
fn main() {
let v1 = Default { value: 0};
let v2 = Default::<bool> { value: false};
println!("{} {}", v1.value, v2.value);
}
函数中的泛型
fn test<T: std::fmt::Display> (a: T) {
println!("{}", a);
}
fn main() {
test(1)
}
如果需要多个类型参数,则需要多个泛型。
fn test<T1: std::fmt::Display, T2: std::fmt::Display> (a: T1, b: T2) {
println!("{}", a);
println!("{}", b);
}
fn main() {
test(1, 2.0f32)
}
impl中的泛型
impl的时候也可以使用泛型。在impl<Trait>for<Type>{}这个语法结构中,泛型类型既可以出现在<Trait>位置,也可以出现在<Type>位置。
网友评论