81 lines
1.7 KiB
Rust
81 lines
1.7 KiB
Rust
|
use std::fmt::Display;
|
||
|
|
||
|
struct Pair<T> {
|
||
|
x: T,
|
||
|
y: T,
|
||
|
}
|
||
|
|
||
|
impl<T> Pair<T> {
|
||
|
fn new(x: T, y: T) -> Self {
|
||
|
Self {
|
||
|
x,
|
||
|
y,
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Only implements method if both traits are satisfied
|
||
|
impl<T: Display + PartialOrd> Pair<T> {
|
||
|
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());
|
||
|
// }
|