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();
}
 
 
posted @   丢丢乱射  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示