A trait in Rust is a group of methods that are defined for a particular type. Traits are an abstract definition of shared behavior amongst different types. So, in a way, traits are to Rust what interfaces are to Java or abstract classes are to C++. A trait method is able to access other methods within that trait.
A trait is implemented similarly to an inherent implementation except that a trait name and the for
keyword follow the impl
keyword before the type name. Let’s implement an built-in trait called ToString
on a Dog
struct:
struct Dog {name: String,age: u32,owner: String}// Implementing an in-built trait ToString on the Dog structimpl ToString for Dog {fn to_string(&self) -> String{return format!("{} is a {} year old dog who belongs to {}.", self.name, self.age, self.owner);}}fn main() {let dog = Dog{name: "Frodo".to_string(), age: 3, owner: "Maryam".to_string()};println!("{}", dog.to_string());}
Now that we know how to implement traits, we can get to defining traits ourselves. In the following program, we will define a Details
trait on a Movie
struct using the trait
keyword:
struct Movie {title: String,director: String,release_year: u32,genre: String}// Defining a Details trait by defining the functionality it should includetrait Details {fn description(&self) -> String;fn years_since_release(&self) -> u32;}// Implementing the Details trait on Movie structimpl Details for Movie{// Method returns an overview of the moviefn description(&self) -> String{return format!("{}, released in {}, is a {} movie directed by {}.", self.title, self.release_year, self.genre, self.director);}// Method returns the number of years between the writing year of this shot i.e.// 2020 and the release year of the moviefn years_since_release(&self) -> u32{return 2020 - self.release_year;}}fn main() {let movie1 = Movie{title: "Titanic".to_string(),director: "James Cameron".to_string(),release_year: 1997,genre: "historical".to_string()};println!("{}", movie1.description());println!("The movie was released {} years ago.", movie1.years_since_release());let movie2 = Movie{title: "The Dark Knight".to_string(),director: "Christopher Nolan".to_string(),release_year: 2008,genre: "action".to_string()};println!("\n{}", movie2.description());println!("The movie was released {} years ago.", movie2.years_since_release());}