特征

深入理解 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();
        }
    }
}

练习

通过以下练习加深对特征的理解:

  1. 创建一个 Printable 特征并为多个类型实现它
  2. 使用特征约束实现一个泛型函数
  3. 实现一个使用特征对象的简单GUI系统
返回首页