rust的trait很想是java的interface
如何定义、实现一个trait
通过关键字pub trait XXX{},trait里定义的方法如果没有默认实现,可以没有方法体,那么所有实现该trait的strut的必须实现该方法,如果提供默认方法。
1 | //定义trait 并且定义了trait的函数,给出了默认实现 |
实现该trait其中NewsArticle和Tweet都实现了Summary这个trait
- 需要注意的是如果要实现trait,必须满足trait或者类型是在当前pakcage下定义的【为了安全防止你的代码别别人破坏或者别人破坏你的代码】
1 | pub struct NewsArticle { |
main函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21fn main() {
let news_article = &NewsArticle {
headline: String::from("头条"),
location: String::from("北京"),
auther: String::from("ericliu"),
content: String::from("学习RUST的trait"),
};
println!("新闻摘要:{}", news_article.sumarize());
println!("新闻 break_info:{}", news_article.break_info());
let tweet = &Tweet {
username: "ericliu".to_string(),
content: String::from("学习RUST的trait"),
reply: false,
retweet: false,
};
println!("推文摘要:{}", tweet.sumarize());
println!("推文 break_info:{}", tweet.break_info());
}
trait bound
我们在定义方法如果用到泛型的时候可以通过trait bound的概念对泛型进行一些定义,类似java中的
1 | fn main() { |
trait可以对泛型的实现进行限制
该场景主要用于加强某些trait的行为,比如说让所有实现了traitA的类型具有B的功能,具体实现方法见下面,典型的例子是rust标准库中实现了Display的函数都实现了ToString这个trait
1 | pub trait BreakNews { |