泛型是运行时指定数据类型的一种机制。好处是通过高度的抽象,使用一套代码应用多种数据类型。比如我们的向量,可以使用数值类型,也可以使用字符串类型。泛型是可以保证数据安全和类型安全的,还同时减少代码量。
Rust 语言中的泛型主要包含 泛型集合、泛型结构体、泛型函数、范型枚举 和 特质 。
Rust 使用使用 <T>
语法来实现泛型, 其中 T
可以是任意数据类型。
我们之前用过的向量。我们可以创建 i32 类型的,也可以创建字符串类型的,但是一旦确定了类型,就不能添加其他类型,否则报错。
let mut v:Vec<i32> =vec![1,2,3];
v.push("4");//此处会报错 ^^^ expected `i32`, found `&str`
说明向量需要的是 i32 类型的值,现在给了一个字符串。从这点看,泛型 让集合更通用,也更安全。
定义语法
struct 结构体名称<T> {
元素:T,
}
struct Data<T> {
value:T,
}
fn main() {
let t:Data<i32> = Data{value:100};
println!("值:{} ",t.value);//输出 值:100
let t:Data<f64> = Data{value:66.00};
println!("值:{} ",t.value);//输出 值:66
}
可以把这个特质(traits)对标其他语言的接口,都是对行为的抽象。使用 trait
关键字用来定义。特质,可以包含具体的方法,也可以包含抽象的方法。
trait some_trait {
// 没有任何实现的虚方法
fn method1(&self);
// 有具体实现的普通方法
fn method2(&self){
//方法的具体代码
}
}
Rust 使用 impl for 为每个结构体实现某个特质。impl
是 implement
的缩写。
struct Book {
name: String,
id: u32,
author: String,
}
trait ShowBook {
fn Show(&self);
}
impl ShowBook for Book{
fn Show(&self) {
println!("Id:{},Name:{},Author:{}",self.id,self.name,self.author);
}
}
fn main() {
let book = Book{
id:1,
name: String::from("Go语言极简一本通"),
author: String::from("欢喜")
};
book.Show();//输出 Id:1,Name:Go语言极简一本通,Author:欢喜
}
主要是指参数是泛型类型,不要求所有参数都必须是泛型参数,可以是某一个参数是泛型类型。
fn 方法名<T[:特质名称]>(参数1:T, ...) {
// 函数实现代码
}
fn show2<T:Display>(t:T){
println!("{}",t);
}
impl Display for Book{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
println!("Id:{},Name:{},Author:{}",self.id,self.name,self.author);
let r=Result::Ok(());
return r;
}
}
show2(book);//输出 Id:1,Name:Go语言极简一本通,Author:欢喜
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。