pub trait Summary { fn summarize(&self) -> String { // default implementarion format!("(Read more from {}...)", self.summarize_author()) } fn summarize_author(&self) -> String { String::from("Anonymous") } } pub struct NewsArticle { pub headline: String, pub location: String, pub author: String, pub content: String, } impl Summary for NewsArticle { fn summarize(&self) -> String { format!("{}, by {} ({})", self.headline, self.author, self.location) } // fn summarize_author(&self) -> String { // format!("{}", self.author) // } } pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool, } impl Summary for Tweet { // fn summarize(&self) -> String { // format!("{}: {}", self.username, self.content) // } fn summarize_author(&self) -> String { format!("@{}", self.username) } } // Traits as parameter // pub fn notify(item: &impl Summary) { // println!("Breaking news! {}", item.summarize()); // } // Trait bound syntax pub fn notify(item: &T) { println!("Breaking news! {}", item.summarize()); } // statements below are equivalent // pub fn nofity(item1: &impl Summary, item2: Summary) {} // pub fn nofity(item1: &T, item2: &T) {} // use std::fmt::Display; // multiple bound // pub fn notify(item: &(impl Summary + Display)) {} // or // pub fn notify(item: &T) {} // where clause // pub fn notify(item: &T) // where T: Summary + Display // {} // return impl Trait fn return_summarizble() -> impl Summary { Tweet { username: String::from("horse_ebooks"), content: String::from("of course, as you probably already know, people"), reply: false, retweet: false, } }