| 
                             Traits are Rust's way of defining shared behavior between types. They are
similar to interfaces or abstract base classes in other languages. A trait
can be implemented for any type, and it can be used to define a set of
methods that a type must have in order to be considered a member of that
trait. This allows you to define shared behavior between types that are not
related by inheritance. 
                         | 
                
            
                
                
                
                    | 
                        
                     | 
                        
                    
                        
                            
                                
                                     
                                
                                
                                     
                                
                            
                            fn main() {
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Define a trait named Shape with a method signature named area. 
                     | 
                        
                    
                        
                            
                                trait Shape {
        fn area(&self) -> f64;
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Define two structs, Circle and Rectangle, that implement the Shape
trait. Each struct has its own implementation of the area method. 
                     | 
                        
                    
                        
                            
                                struct Circle {
        radius: f64,
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                        
                     | 
                        
                    
                        
                            
                                impl Circle {
        fn new(radius: f64) -> Circle {
            Circle { radius }
        }
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Implement the Shape trait for the Circle struct. 
                     | 
                        
                    
                        
                            
                                impl Shape for Circle {
        fn area(&self) -> f64 {
            3.4 * self.radius * self.radius
        }
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                        
                     | 
                        
                    
                        
                            
                                struct Rectangle {
        width: f64,
        height: f64,
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                        
                     | 
                        
                    
                        
                            
                                impl Rectangle {
        fn new(width: f64, height: f64) -> Rectangle {
            Rectangle { width, height }
        }
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Implement the Shape trait for the Rectangle struct. 
                     | 
                        
                    
                        
                            
                                impl Shape for Rectangle {
        fn area(&self) -> f64 {
            self.width * self.height
        }
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Create instances of Circle and Rectangle and call their area methods. 
                     | 
                        
                    
                        
                            
                                let circle = Circle::new(5.0);
    let rectangle = Rectangle::new(10.0, 20.0);
 
                        
                     | 
                
                
            
                
                
                
                    | 
                         Define a function that takes a reference to a Shape trait object and
calls its area method. This function can be used to print the area of
any type that implements the Shape trait. &dyn Shape is a reference
to a trait object that represents any type that implements the Shape
trait. 
                     | 
                        
                    
                        
                            
                                fn print_area(shape: &dyn Shape) {
        println!("Area: {}", shape.area());
    }
 
                        
                     | 
                
                
            
                
                
                
                    | 
                        
                     | 
                        
                    
                        
                            
                                print_area(&circle);
    print_area(&rectangle);
}
 
                        
                     |