详解
定义一个特征,和接口类似,它可以定义一组被共享的行为,只要满足特征,就可以使用特征定义的行为。
特征使用tcait关键字。
pub trait Summary {
fn summarize(&self) -> String;
}
pub struct Post {
pub title: String, // 标题
pub author: String, // 作者
pub content: String, // 内容
}
impl Summary for Post {
fn summarize(&self) -> String {
format!("文章{}, 作者是{}", self.title, self.author)
}
}
pub struct Weibo {
pub username: String,
pub content: String
}
impl Summary for Weibo {
fn summarize(&self) -> String {
format!("{}发表了微博{}", self.username, self.content)
}
}
fn main() {
let post = Post{title: "Rust语言简介".to_string(),author: "Sunface".to_string(), content: "Rust棒极了!".to_string()};
let weibo = Weibo{username: "sunface".to_string(),content: "好像微博没Tweet好用".to_string()};
println!("{}",post.summarize());
println!("{}",weibo.summarize());
}
以上是一个简单的完整的例子,首先定义了一个特征Summary,然后用之前的方法,定义了post的结构体和方法,方法中使用了特征
默认实现
可以在特征中定义具有默认实现的方法,也就是在特征之后添加行为,比如输出一些信息,这样其它类型无需再实现该方法,或者也可以选择重载该方法:
pub trait Summary {
fn summarize(&self) -> String {
String::from("(Read more...)")
}
}
上面为 Summary
定义了一个默认实现
impl Summary for Post {}
impl Summary for Weibo {
fn summarize(&self) -> String {
format!("{}发表了微博{}", self.username, self.content)
}
}
上面这段代码中,Post方法是选择了默认实现,而Weibo方法重载了summarize,你可以理解为summarize默认就是那样,其他方法或者函数可以直接在内部重新定义summarize的实现,达到你想要的效果
println!("{}",post.summarize());
println!("{}",weibo.summarize());
会输出:
(Read more...)
sunface发表了微博好像微博没Tweet好用
默认实现还可以调用同特征下的其他方法
pub trait Summary {
fn summarize_author(&self) -> String;
fn summarize(&self) -> String {
format!("(Read more from {}...)", self.summarize_author())
}
}
这段代码中的summarize是默认实现
impl Summary for Weibo {
fn summarize_author(&self) -> String {
format!("@{}", self.username)
}
}
println!("1 new weibo: {}", weibo.summarize());
weibo.summarize()
会先调用 Summary
特征默认实现的 summarize
方法,通过该方法进而调用 Weibo
为 Summary
实现的 summarize_author
方法,最终输出:1 new weibo: (Read more from @horse_ebooks...)
。
仅登录用户可评论,点击 登录