详解

定义一个特征,和接口类似,它可以定义一组被共享的行为,只要满足特征,就可以使用特征定义的行为。

特征使用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 方法,通过该方法进而调用 WeiboSummary 实现的 summarize_author 方法,最终输出:1 new weibo: (Read more from @horse_ebooks...)

最后修改:2024 年 05 月 05 日
如果觉得我的文章对你有用,请随意赞赏