Structs, Enums and Traits

Rust Traits

Describe shared behavior once and implement it for any type, like interfaces in other languages.

  • Intermediate
  • 4 min read
  • 1 runnable example
What you'll learn
  • Defining a trait
  • Default methods
  • impl Trait and dyn Trait
trait Describe
  • Describe
    • Dogkeeps the default
    • Robotreplaces describe

Shared behavior for different types

A trait is a set of methods that a type can implement, similar to an interface in other languages. Code written against the trait works with every type that implements it.

Describe requires name and gives describe a default body. Dog keeps the default, while Robot replaces it. introduce accepts any type that implements Describe, and Box<dyn Describe> lets one vector hold values of different types.

Key points

  1. A trait lists methods a type must have.
  2. A default method can be kept or replaced.
  3. Box<dyn Trait> stores different types together.

Runnable Rust example

Rust
Run code →
main.rs
trait Describe {
    fn name(&self) -> String;

    fn describe(&self) -> String {
        format!("This is {}.", self.name())
    }
}

struct Dog;
struct Robot {
    model: u32,
}

impl Describe for Dog {
    fn name(&self) -> String {
        String::from("a dog")
    }
}

impl Describe for Robot {
    fn name(&self) -> String {
        format!("robot model {}", self.model)
    }

    fn describe(&self) -> String {
        format!("Beep. I am {}.", self.name())
    }
}

fn introduce(item: &impl Describe) {
    println!("{}", item.describe());
}

fn main() {
    introduce(&Dog);
    introduce(&Robot { model: 7 });

    let items: Vec<Box<dyn Describe>> = vec![Box::new(Dog), Box::new(Robot { model: 8 })];
    println!("{} items", items.len());
}
Get a Run button for this example Result of running the code
This is a dog.
Beep. I am robot model 7.
2 items

Practice

Open the example in the online compiler, change a value or add a line, and predict the output before you run it. Then break the code on purpose and read the compiler's message.

Finished this lesson?

Mark it as learned to track your progress.

Next: Generics →

Practice with a challenge

Use what this lesson covers to solve a real problem. Each challenge runs in your browser with instant tests and an AI review.

All challenges