diff --git a/src/traits.md b/src/traits.md index f19ad8ed..b1c54d0f 100644 --- a/src/traits.md +++ b/src/traits.md @@ -35,3 +35,20 @@ fn main() { } } ``` + +
+ +* Traits may specify pre-implemented (default) methods and methods that users are required to implement themselves. Methods with default implementations can rely on required methods. +* Types that implement a given trait may be of different sizes. This makes it impossible to have things like `Vec` in the example above. +* `dyn Greet` is a way to tell the compiler about a dynamically sized type that implements `Greet`. +* In the example, `pets` holds Fat Pointers to objects that implement `Greet`. The Fat Pointer consist of two components, a pointer to the actual object and a pointer to the virtual method table for the `Greet` implementation of that particular object. + +Compare these outputs in the above example: +```rust,ignore + println!("{} {}", std::mem::size_of::(), std::mem::size_of::()); + println!("{} {}", std::mem::size_of::<&Dog>(), std::mem::size_of::<&Cat>()); + println!("{}", std::mem::size_of::<&dyn Greet>()); + println!("{}", std::mem::size_of::>()); +``` + +