模块课程(2/2)
特质和特质界限
特征定义特定类型具有的行为以及可以与其他类型共享的行为。我们可以使用特征来定义一组代表某种通用功能或接口的方法,类似于其他编程语言中的接口。
特征边界允许我们指定泛型类型必须实现特定的特征,确保所需的方法在编译时可用。
定义和实施特质
为了定义特征,我们使用 trait 关键字,后跟实现类型必须定义的方法的签名:
pub trait Summary {
fn summarize(&self) -> String;
}要在具体类型上实现特征,我们使用语法 impl TraitName for TypeName:
pub struct NewsArticle {
pub headline: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}特质界限
在编写泛型函数时,我们可以限制类型参数以确保它们实现特定的特征。标准语法是 <T: Trait>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}或者,对于更复杂的签名,我们可以使用 where 子句:
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}自己尝试一下
练习 1:总结特征
定义一个名为 Summary 的特征,其中包含方法签名 fn summarize(&self) -> String;。接下来,定义一个带有 String 类型的标题字段的 struct NewsArticle 并为其实现 Summary 特征,以便 summarise 方法返回标题字段的值。
显示提示
定义“Summary”特征和“NewsArticle”结构。使用“impl Summary for NewsArticle”克隆字段“self.headline.clone()”来实现。
3 次尝试后可用的解决方案
练习 2:使用 print_summary 进行特征边界
根据上一个练习中的代码,定义一个名为 print_summary<T> 的通用函数,该函数接受 &T 类型的参数项。应用特征界限,以便 T 必须实现摘要特征。在函数内部,打印 item.summarize() 返回的结果。
显示提示
使用签名“fn print_summary<T: Summary>(item: &T)”并在“println!”内调用“item.summarize()”。
3 次尝试后可用的解决方案
练习 3:使用特征计算面积
使用方法 fn area(&self) -> f64; 定义一个名为 Area 的特征。创建一个包含 f64 类型的 radius 字段的 struct Circle,并通过计算面积(公式:radius * radius * 3.14159)为其实现 Area 特征。
显示提示
定义“Area”特征和“Circle”结构。使用圆面积公式实现“area(&self)”。
3 次尝试后可用的解决方案