Trusted answers to developer questions
Trusted Answers to Developer Questions

Related Tags

rust
implementation
trait

What are traits in Rust?

Anusheh Zohair Mustafeez

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 ©2022 Educative, Inc. All rights reserved
RELATED COURSES

View all Courses

Keep Exploring