📅  最后修改于: 2020-11-02 04:21:48             🧑  作者: Mango
泛型是一种为具有不同类型的多个上下文编写代码的工具。在Rust中,泛型是指数据类型和特征的参数化。泛型可以通过减少代码重复并提供类型安全性来编写更简洁明了的代码。泛型的概念可以应用于方法,功能,结构,枚举,集合和特征。
以下示例声明一个只能存储整数的向量。
fn main(){
let mut vector_integer: Vec = vec![20,30];
vector_integer.push(40);
println!("{:?}",vector_integer);
}
[20, 30, 40]
考虑以下代码片段-
fn main() {
let mut vector_integer: Vec = vec![20,30];
vector_integer.push(40);
vector_integer.push("hello");
//error[E0308]: mismatched types
println!("{:?}",vector_integer);
}
上面的示例显示整数类型的向量只能存储整数值。因此,如果我们尝试将字符串值推入集合,则编译器将返回错误。泛型使集合更安全。
type参数表示一种类型,编译器稍后将填充该类型。
struct Data {
value:T,
}
fn main() {
//generic type of i32
let t:Data = Data{value:350};
println!("value is :{} ",t.value);
//generic type of String
let t2:Data = Data{value:"Tom".to_string()};
println!("value is :{} ",t2.value);
}
上面的示例声明了一个名为Data的通用结构。
value is :350
value is :Tom
特性可以用于实现跨多个结构的一组标准行为(方法)。特性类似于面向对象编程中的接口。 trait的语法如下所示-
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
}
}
特质可以包含具体方法(有主体的方法)或抽象方法(无主体的方法)。如果方法定义将由实现该Trait的所有结构共享,请使用一种具体方法。但是,结构可以选择覆盖由特征定义的函数。
如果方法定义因实现结构而异,请使用抽象方法。
impl some_trait for structure_name {
// implement method1() there..
fn method1(&self ){
}
}
以下示例使用print()方法定义特征Printable ,该特征由结构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: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