Traits

Declared like an implementation, but with no function bodies. Can have a body, which becomes the default implementation. Like C# abstract classes.


#![allow(unused)]
fn main() {
trait DoAThing {
    fn do_the_thing(&self) -> String;
}

impl DoAThing for u8 {
    fn do_the_thing(&self) -> String {
        format!("The thing is done for {:?}", &self);
    }
}
}

You can implement external traits on internal types, and internal traits on external types, but not external traits on external types.

Traits as function parameters is a bit weird. We have to use &impl DoAThing instead of just the trait name.


#![allow(unused)]
fn main() {
fn process_doers(thing: &impl DoAThing) -> String {
    thing.do_the_thing()
}
}

The above is syntactic sugar for (trait bound syntax):


#![allow(unused)]
fn main() {
fn process_doers<T: DoAthing>(thing: &T) -> String {}
}

I think I prefer the trait bound syntax.