Forward, Turn, and Stop are still three different data types. There's no data type that represents Forward, Turn, Stop, and though we could create one using an enumeration, there's another way. There is a data type that represents a borrow of any data type that has the PrintableDirection trait. It's written as &dyn PrintableDirection and is called a trait object reference.
The dyn keyword is short for dynamic dispatch, and it means that what looks and acts like a borrow in most ways is actually a little more complicated. The memory address stored in the borrow itself is actually the address of a hidden data structure.
That hidden data structure contains the actual borrow address and the memory addresses of the functions that implement the trait for the borrowed data value. When we assign a data value to a trait object, Rust initializes that hidden data structure, and when we call one of the trait functions, Rust looks up which function to actually call in the same hidden data structure.