特征
深入理解 Rust 的特征系统
特征(Traits)基础
特征定义了类型可以共享的功能,类似于其他语言中的接口。
定义特征
trait 定义了一组可以被共享的行为:
Trait 定义
pub trait Summary {
fn summarize(&self) -> String;
fn default_behavior(&self) -> String {
String::from("Read more...")
}
}
实现特征
为类型实现 trait:
Trait 实现
pub struct NewsArticle {
pub headline: String,
pub location: String,
pub author: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}, by {} ({})",
self.headline, self.author, self.location)
}
}
特征作为参数
trait 可以用作函数参数:
Trait 作为参数
pub fn notify(item: &impl Summary) {
println!("Breaking news! {}", item.summarize());
}
// 使用 trait bound 语法
pub fn notify(item: &T) {
println!("Breaking news! {}", item.summarize());
}
多个 trait bound
可以指定多个 trait bound:
多个 Trait Bounds
pub fn notify(item: &T) {
println!("Breaking news! {}", item.summarize());
}
// 使用 where 从句
pub fn some_function(t: &T, u: &U) -> i32
where T: Display + Clone,
U: Clone + Debug
{
// 函数体
}
返回实现特征的类型
fn returns_summarizable() -> impl Summary {
NewsArticle {
headline: String::from("Rust 1.0 发布"),
location: String::from("San Francisco"),
author: String::from("Rust Team"),
content: String::from("..."),
}
}
特征对象
使用特征对象实现运行时多态:
pub trait Draw {
fn draw(&self);
}
pub struct Screen {
pub components: Vec>,
}
impl Screen {
pub fn run(&self) {
for component in self.components.iter() {
component.draw();
}
}
}
练习
通过以下练习加深对特征的理解:
- 创建一个 Printable 特征并为多个类型实现它
- 使用特征约束实现一个泛型函数
- 实现一个使用特征对象的简单GUI系统