/** * Trait: 定义共同行为 * * trait定义了某个特定类型拥有可能与其他类型共享的功能。可以通过trait * 以一种抽象的方式定义共享的行为。可以使用trait bounds指定泛型是任何 * 拥有特定行为的类型。 * * 注意:trait类似于其他语言中常被称为接口(interfaces)的功能,虽然 * 有一些不同。 * * 实现trait时需要注意的一个限制是,只有当至少一个trait或者要实现trait * 的类型位于crate的本地作用域时,才能为该类型实现trait,也即不能为 * 外部类型实现外部trait。 * 这个限制被称为相干性的程序属性的一部分,或者更具体的说是孤儿规则 * ,其得名于不存在父类型。 * 这条规则确保了其他人编写的代码不会破坏你的代码,反之亦然。没有这 * 条规则的话,两个crate可以分别对相同的类型实现相同的trait,而Rust * 将无从得知应该使用哪一个实现。 * */ fn main() { let tweet = Tweet { username: String::from("horse_ebooks"), content: String::from("of course, as you probably already know, people"), reply: false, retweet: false, }; println!("1 new tweet: {}", tweet.summarize()); let article = NewsArticle { headline: String::from("Penguins win the Stanley Cup Championship!"), location: String::from("Pittsburgh, PA, USA"), author: String::from("Iceburgh"), content: String::from( r#"The Pittsburgh Penguins once again are the best hockey team in the NHL."# ), }; println!("New article available! {}", article.summarize()); println!("New article available! {}", article.summarize_author()); println!("{}, {}, {}, {}", article.author, article.headline, article.location, article.content); println!("{}, {}, {}, {}", tweet.username, tweet.content, tweet.reply, tweet.retweet); } /** * 定义 trait * * 一个类型的行为由其可提供调用的方法构成。如果可以对不同类型调用相同的 * 方法的话,这些类型就可以共享相同的行为了。trait定义是一种将方法签名 * 组合起来的方法,目的是定义一个实现某些目的所必需的行为的集合。 * * 在方法签名后跟分号,而不是在大括号中提供其是实现。接着每一个实现这个 * trait的类型都需要提供其自定以行为的方法体,编译器也会确保任何实现了 * Summary trait的类型都拥有与这个签名的定义完全一致的summarize方法。 * * trait体中可以有多个方法,一行一个方法签名且都以分号结尾。 * * 默认实现: 有实 * * 注意: 无法从相同方法的重载实现中调用默认方法 */ trait Summary { fn summarize_author(&self) -> String; fn summarize(&self) -> String { format!("(Read more from {}...)", self.summarize_author()) // format!("(Read more from ...)") } } struct NewsArticle { author: String, headline: String, location: String, content: String, } impl Summary for NewsArticle { fn summarize_author(&self) -> String { format!("author: {}", self.author) } // fn summarize(&self) -> String { // format!("{}, by {} ({})", self.headline, self.author, self.location) // } } struct Tweet { username: String, content: String, reply: bool, retweet: bool, } impl Summary for Tweet { fn summarize_author(&self) -> String { // println!("默认方法 : {}", self.summarize()); format!("@{}", self.username) } // fn summarize(&self) -> String { // format!("{}: {}", self.username, self.content) // } }