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);
}
相关推荐
SkyStream5 分钟前
无人机系列-篇三-AI视频识别接入架构与优化
后端
SkyStream10 分钟前
无人机系列-篇二-ZLMediaKit多路流管理与分发
后端
ShuiShenHuoLe23 分钟前
Go html/template 使用入门
开发语言·golang·html
geovindu24 分钟前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
冻柠檬飞冰走茶43 分钟前
PTA基础编程题目集 7-34 通讯录的录入与显示(C语言实现)
c语言·开发语言·数据结构·算法
环境栈笔记1 小时前
指纹浏览器安全评测方法:核对环境、数据与权限后再选型
前端·人工智能·后端·自动化
星核0penstarry1 小时前
DeepSeek-V4-Flash 正式公测:大模型行业进入「极速平价普惠时代」
java·开发语言·人工智能
老洋葱Mr_Onion1 小时前
【C++】高精度模板
开发语言·c++·算法
寒水馨1 小时前
macOS下载、安装ripgrep-15.2.0(附安装包ripgrep-15.2.0-aarch64-apple-darwin.tar.gz)
macos·正则表达式·rust·ripgrep·rg·命令行搜索·代码搜索