use std::fmt::Display; struct Pair { x: T, y: T, } impl Pair { fn new(x: T, y: T) -> Self { Self { x, y, } } } impl Pair { fn cmp_display(&self) { if self.x >= self.y { println!("{}", self.x); } else { println!("{}", self.y); } } } pub trait Summary { fn summarize(&self) -> String { format!("(read more from {}...)", self.summarize_author()) } fn summarize_author(&self) -> String; } 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) } } pub fn notify(item: impl Summary) { println!("breaking news: {}", item.summarize()); } fn returns_summarizable() -> impl Summary { NewsArticle { headline: String::from("Penguins win the stanley cup championship!"), location: String::from("Pittsburgh, PA, USA"), author: String::from("Iceburgh"), content: String::from("The pittsburgh penguins are winners I guess."), } // Tweet { // username: String::from("horse_ebooks"), // content: String::from("of course blargh"), // reply: false, // retweet: false, // } } 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, }; //dbg!(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("The pittsburgh penguins are winners I guess."), }; //dbg!(article.summarize()); //notify(tweet); returns_summarizable(); }