diff options
Diffstat (limited to 'traits/src/lib.rs')
| -rw-r--r-- | traits/src/lib.rs | 78 | 
1 files changed, 78 insertions, 0 deletions
| diff --git a/traits/src/lib.rs b/traits/src/lib.rs new file mode 100644 index 0000000..a0255ea --- /dev/null +++ b/traits/src/lib.rs @@ -0,0 +1,78 @@ +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<T: Summary>(item: &T) { +    println!("Breaking news! {}", item.summarize()); +} + +// statements below are equivalent +// pub fn nofity(item1: &impl Summary, item2: Summary) {} +// pub fn nofity<T: Summary>(item1: &T, item2: &T) {} + +// use std::fmt::Display; +// multiple bound +// pub fn notify(item: &(impl Summary + Display)) {} +// or +// pub fn notify<T: Summary + Display>(item: &T) {} +// where clause +// pub fn notify<T>(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, +    } +} | 
