use std::fmt::Display; struct Pair { x: T, y: T, } impl Pair { fn new(x: T, y: T) -> Self { Self { x, y, } } } // Only implements method if both traits are satisfied impl Pair { fn cmp_display(&self) { if self.x >= self.y { println!("The largest member is x = {}", self.x); } else { println!("The largest member is y = {}", self.y); } } } pub trait Summary { fn summarize_author(&self) -> String; // default implementation fn summarize(&self) -> String { String::from("(Read more...)") } } pub struct NewsArticle { pub headline: String, pub location: String, pub author: String, pub content: String, } impl Summary for NewsArticle { fn summarize_author(&self) -> String { self.author.to_string() } fn summarize(&self) -> String { format!("{}, by {} ({})", self.headline, self.author, self.location) } } pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool, } // Uses default implementation for summarize method impl Summary for Tweet { fn summarize_author(&self) -> String { format!("@{}", self.username) } } pub fn returns_summarizable() -> impl Summary { Tweet { username: String::from("horse_ebooks"), content: String::from("of course, as you probably already know, people"), reply: false, retweet: false, } } // Function/method requiring a trait's implementation // pub fn notify(item: impl Summary) { // println!("Breaking news! {}", item.summarize()); // }