跳转到主要内容
模块 5 · 第 2 课(共 2)课程中的10/14~15 min
模块课程(2/2)

特质和特质界限

特征定义特定类型具有的行为以及可以与其他类型共享的行为。我们可以使用特征来定义一组代表某种通用功能或接口的方法,类似于其他编程语言中的接口。

特征边界允许我们指定泛型类型必须实现特定的特征,确保所需的方法在编译时可用。


定义和实施特质

为了定义特征,我们使用 trait 关键字,后跟实现类型必须定义的方法的签名:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

要在具体类型上实现特征,我们使用语法 impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

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

特质界限

在编写泛型函数时,我们可以限制类型参数以确保它们实现特定的特征。标准语法是 <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

或者,对于更复杂的签名,我们可以使用 where 子句:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

自己尝试一下

练习 1:总结特征

锻炼#rust.m5.l2.e1
尝试:0加载中...

定义一个名为 Summary 的特征,其中包含方法签名 fn summarize(&self) -> String;。接下来,定义一个带有 String 类型的标题字段的 struct NewsArticle 并为其实现 Summary 特征,以便 summarise 方法返回标题字段的值。

正在加载编辑器...
显示提示

定义“Summary”特征和“NewsArticle”结构。使用“impl Summary for NewsArticle”克隆字段“self.headline.clone()”来实现。

3 次尝试后可用的解决方案

练习 2:使用 print_summary 进行特征边界

锻炼#rust.m5.l2.e2
尝试:0加载中...

根据上一个练习中的代码,定义一个名为 print_summary<T> 的通用函数,该函数接受 &T 类型的参数项。应用特征界限,以便 T 必须实现摘要特征。在函数内部,打印 item.summarize() 返回的结果。

正在加载编辑器...
显示提示

使用签名“fn print_summary<T: Summary>(item: &T)”并在“println!”内调用“item.summarize()”。

3 次尝试后可用的解决方案

练习 3:使用特征计算面积

锻炼#rust.m5.l2.e3
尝试:0加载中...

使用方法 fn area(&self) -> f64; 定义一个名为 Area 的特征。创建一个包含 f64 类型的 radius 字段的 struct Circle,并通过计算面积(公式:radius * radius * 3.14159)为其实现 Area 特征。

正在加载编辑器...
显示提示

定义“Area”特征和“Circle”结构。使用圆面积公式实现“area(&self)”。

3 次尝试后可用的解决方案