Traits are probably Rust's most complex feature, supporting a wide range of use cases and design tradeoffs. Patterns of trait usage are still emerging.
Trait objects have some significant limitations: methods
invoked through a trait object cannot use generics, and cannot use
Self except in receiver position.
If a trait is meant to be used as an object, its methods should take and return trait objects rather than use generics.
[FIXME] Guidelines for default methods.