rust入门(4) Trait 特征
//类型 c#中的接口 interface
// 1抽象的方式定义共享的行为
// 2trait bounds 指定泛型是任何拥有特定行为的类型
//定义两个结构体
pub struct Student{
pub name:String,
pub age:u32,
}
pub struct Teacher{
pub name :String,
pub age:u32,
pub subject:String,
}
//定义trait
pub trait GetInfomation{
fn get_name(&self)->&String;
fn get_age(&self)->u32;
}
pub trait GetName{
fn get_name(&self)->&String;
}
pub trait GetAge{
fn get_age(&self)->i32;
}
pub trait SchoolName{
get_school_name(&self)->String
{ String::from("红心学校") }
}
//实现trait
impl GetInfomation for Student{
fn get_name(&self)->&String{
&self.name
}
fn get_age(&self)->u32{
self.age
}
}
impl GetName for Student{
fn get_name(&self)->&String {
&&self.name
}
}
impl GetAge for Student{
fn get_age(&self)->i32 {
self.age
}
}
impl GetInfomation for Teacher{
fn get_name(&self)->&String{
&self.name
}
fn get_age(&self)->u32{
self.age
}
}
//默认实现 学生的是默认实现,老师的在 impl 中重写下
impl SchoolName for Student{}
impl SchoolName for Teacher{
fn get_school_name(&self)->String{
String::from("兰心小学")
}
}
//trait 作为参数
fn pint_infomation(item:&impl GetInfomation)
{
pintln!("name is {},age is {}",item.get_name(),item.get_age());
}
Trait Bound 语法 就是用trait 作为参数的另一种写法 跟之前的泛型有联系了
fn print_infomation_with_trait_bound<T:GetInfomation>(item:&T){
println!("name is {}",item.get_name());
println!("age is {}",item.get_age());
}
fn print_infomation_with_muilty_trait<T>(item:&T)
where T:GetAge+GetName
{
println!("name is {}",item.get_name());
println!("age is {}",item.get_age());
}
//trait 作为返回值
fn produce_item_with_age()->impl GetAge{
Student{name:"小强".to_string(),age:19}
}
fn main() {
let s = Student{name:String::from("张三"),age:1};
let t=Teacher{name:String::from("王老师"),age:18,subject:String::from("数学")};
println!("student name={},age={}",s.get_name(),s.get_age());
println!("teacher name={},age={}",t.get_name(),t.get_age());
let student_school_name = s.get_school_name();
let teacher_school_name = t.get_school_name();
let s=produce_item_with_age();
}
浙公网安备 33010602011771号