Rust 泛型类型
泛型是一种用于编写适用于不同类型上下文的代码的工具。在Rust中,泛型指的是对数据类型和特质进行参数化。通过减少代码重复并提供类型安全性,泛型允许编写更加简洁和清晰的代码。泛型的概念可应用于方法、函数、结构体、枚举、集合和特质。
称为类型参数的
示例:泛型集合
以下示例声明了一个只能存储整数的向量。
fn main(){
let mut vector_integer: Vec<i32> = vec
![20,30];
vector_integer.push(40);
println!("{:?}",vector_integer);
}
输出
[20, 30, 40]
考虑下面的代码片段−
fn main() {
let mut vector_integer: Vec<i32> = vec
![20,30];
vector_integer.push(40);
vector_integer.push("hello");
//error[E0308]: mismatched types
println!("{:?}",vector_integer);
}
上面的示例显示,整数类型的向量只能存储整数值。所以,如果我们尝试将字符串值推入集合中,编译器将会返回一个错误。泛型使得集合更加类型安全。
示例:泛型结构
类型参数表示一个类型,编译器将在后面填充。
struct Data<T> {
value:T,
}
fn main() {
//generic type of i32
let t:Data<i32> = Data{value:350};
println!("value is :{} ",t.value);
//generic type of String
let t2:Data<String> = Data{value:"Tom".to_string()};
println!("value is :{} ",t2.value);
}
上面的示例声明了一个名为Data的通用结构体。
输出:
value is :350
value is :Tom
特性
特性可以用于在多个结构中实现一组标准行为(方法)。特性类似于面向对象编程中的接口。特性的语法如下所示:
声明一个特性
trait some_trait {
//abstract or method which is empty
fn method1(&self);
// this is already implemented , this is free
fn method2(&self){
//some contents of method2
}
}
特质可以包含具体方法(带有方法体)或抽象方法(没有方法体)。如果方法定义将被所有实现特质的结构共享,请使用具体方法。然而,结构可以选择覆盖由特质定义的函数。
如果方法定义对于实现结构不同,使用抽象方法。
语法 – 实现特质
impl some_trait for structure_name {
// implement method1() there..
fn method1(&self ){
}
}
以下示例定义了一个特征 Printable
,其中包含一个名为 print()
的方法,由结构体 book
实现。
fn main(){
//create an instance of the structure
let b1 = Book {
id:1001,
name:"Rust in Action"
};
b1.print();
}
//declare a structure
struct Book {
name:&'static str,
id:u32
}
//declare a trait
trait Printable {
fn print(&self);
}
//implement the trait
impl Printable for Book {
fn print(&self){
println!("Printing book with id:{} and name {}",self.id,self.name)
}
}
输出
Printing book with id:1001 and name Rust in Action
通用函数
该示例定义了一个通用函数,用于显示传递给它的参数。参数可以是任何类型。参数的类型应该实现Display trait,以便其值可以通过println!宏来打印出来。
use std::fmt::Display;
fn main(){
print_pro(10 as u8);
print_pro(20 as u16);
print_pro("Hello TutorialsPoint");
}
fn print_pro<T:Display>(t:T){
println!("Inside print_pro generic function:");
println!("{}",t);
}
输出
Inside print_pro generic function:
10
Inside print_pro generic function:
20
Inside print_pro generic function:
Hello TutorialsPoint