rust:trait

rust中的trait类似于c++中的虚函数。trait可以有默认实现,也可以没有默认实现,类似于c++中的虚函数和纯虚函数。trait和虚函数用来定义接口,规范接口,是实现多态的基础。

c++中的虚函数实现多态,通过继承的方式来实现;rust中trait实现多态,类似于组合的方式,更加分散。

1example

(1)trait xxx声明一个trait,一个trait中可以声明一个或者多个方法

(2)trait中的方法可以有默认实现,也可以没有默认实现;没有默认实现的trait,那么trait实现中必须得实现

(3)impl xxxtrait for xxx

rust 复制代码
pub trait Summary {
  fn summarize_author(&self) -> String;

  fn summarize(&self) -> String {
    format!("Read more from {}...", self.summarize_author())
  }
}


pub struct NewsArticle {
  pub headline : String,
  pub location : String,
  pub author : String,
  pub content : String
}

pub struct Tweet {
  pub username : String,
  pub content : String,
  pub author : String,
  pub reply : bool,
  pub retweet : bool
}

impl Summary for NewsArticle {
  fn summarize_author(&self) -> String {
    format!("{}",self.author)
  }
}

impl Summary for Tweet {
  fn summarize_author(&self) -> String {
    format!("{}",self.author)
  }

  fn summarize(&self) -> String {
    format!("summarize of Tweet {}", self.summarize_author())
  }
}

fn main() {
  let news = NewsArticle {
    headline : String::from("news---headline"),
    location : String::from("news-location"),
    author : String::from("news-author"),
    content : String::from("news-content")
  };
  println!("news article: {}", news.summarize());

  let tweet = Tweet {
    username : String::from("tweet-username"),
    content : String::from("tweet-content"),
    author : String::from("tweet-author"),
    reply : false,
    retweet : false
  };
  println!("tweet: {}", tweet.summarize());
}

2trait约束

在泛型中约束类型。

rust 复制代码
fn largest<T: PartialOrd + Copy>(list : &[T]) -> T {
  let mut largest = list[0];

  for &item in list.iter() {
    if item > largest {
      largest = item;
    }
  }
  largest
}

fn main() {
  let number_list = vec![1,2,3,4,5];
  let result = largest(&number_list);
  println!("largest number {}", result);

  let char_list = vec!['a','b','c','d','e'];
  let result = largest(&char_list);
  println!("largest char {}", result);
}

3trait参数和返回值

report的形参是trait,make_news_article的返回值是trait。

rust 复制代码
pub trait Summary {
  fn summarize_author(&self) -> String;

  fn summarize(&self) -> String {
    format!("Read more from {}...", self.summarize_author())
  }
}


pub struct NewsArticle {
  pub headline : String,
  pub location : String,
  pub author : String,
  pub content : String
}

pub struct Tweet {
  pub username : String,
  pub content : String,
  pub author : String,
  pub reply : bool,
  pub retweet : bool
}

impl Summary for NewsArticle {
  fn summarize_author(&self) -> String {
    format!("{}",self.author)
  }
}

impl Summary for Tweet {
  fn summarize_author(&self) -> String {
    format!("{}",self.author)
  }

  fn summarize(&self) -> String {
    format!("summarize of Tweet {}", self.summarize_author())
  }
}

fn report(item : impl Summary) {
  println!("report {}", item.summarize());
}

fn make_news_article() -> impl Summary {
  NewsArticle {
    headline : String::from("news---headline1"),
    location : String::from("news-location1"),
    author : String::from("news-author1"),
    content : String::from("news-content1")
  }
}

fn main() {
  let news = NewsArticle {
    headline : String::from("news---headline"),
    location : String::from("news-location"),
    author : String::from("news-author"),
    content : String::from("news-content")
  };
  println!("news article: {}", news.summarize());

  let tweet = Tweet {
    username : String::from("tweet-username"),
    content : String::from("tweet-content"),
    author : String::from("tweet-author"),
    reply : false,
    retweet : false
  };
  println!("tweet: {}", tweet.summarize());

  report(tweet);

  let news1 = make_news_article();
  report(news1);
}
相关推荐
葫芦和十三1 小时前
图解 MongoDB 04|索引模型:每建一个索引,就是在 B+-tree 森林里多栽一棵
后端·mongodb·agent
用户47949283569152 小时前
claude Fable用不了?把Gpt 5.5pro接到你的claude code里
前端·后端
GetcharZp4 小时前
告别 Nginx 复杂配置!这款带 Web 面板的万能代理神器,让端口转发变得如此简单
后端
IT_陈寒6 小时前
React的useState居然还有这种坑?我差点删库跑路
前端·人工智能·后端
Pedantic7 小时前
SwiftUI 手势笔记
前端·后端
金銀銅鐵7 小时前
[Python] 从《千字文》中随机挑选汉字
后端·python
飘尘10 小时前
前端转型全栈(Java后端)的快速上手指引
前端·后端·全栈
浏览器工程师11 小时前
AI Agent 接浏览器任务,先别让它一路点到底
前端·后端
行者全栈架构师11 小时前
Maven dependency:tree 的 8 个高级用法
java·后端