Trusted answers to developer questions

What are traits in Rust?

Free System Design Interview Course

Many candidates are rejected or down-leveled due to poor performance in their System Design Interview. Stand out in System Design Interviews and get hired in 2024 with this popular free course.

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.

Implementing a 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 struct
impl 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());
}

Defining a trait

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 include
trait Details {
fn description(&self) -> String;
fn years_since_release(&self) -> u32;
}
// Implementing the Details trait on Movie struct
impl Details for Movie{
// Method returns an overview of the movie
fn 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 movie
fn 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());
}

RELATED TAGS

rust
implementation
trait

CONTRIBUTOR

Anusheh Zohair Mustafeez
Copyright ©2024 Educative, Inc. All rights reserved
Did you find this helpful?