In addition to the ability to create references to existing typed data using the & operator, Rust gives us the ability
to create reference-like structs called smart pointers.
We can think of references at a high level as a type that gives us access to another type. Smart pointers are different in their behavior from normal references in that they operate based on internal logic that a programmer writes. You — the programmer — are the smart part.
Typically smart pointers implement Deref, DerefMut, and Drop traits to specify the logic of what should happen when
the structure is dereferenced with * and . operators.