Structs in Rust

Structs in Rust are custom data types that let you name and package together multiple related values. They are similar to “structs” in C/C++ or “objects” in other languages, but without methods by default. Structs are fundamental for building complex data models in Rust.

Defining a Struct

You define a struct using the struct keyword, followed by the struct name and its fields.

struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

Creating an Instance

You create an instance of a struct by specifying values for each field.

fn main() {
    let user1 = User {
        username: String::from("alice"),
        email: String::from("alice@example.com"),
        sign_in_count: 1,
        active: true,
    };
}

Accessing and Modifying Fields

You can access fields using dot notation. If the instance is mutable, you can also modify its fields.

fn main() {
    let mut user1 = User {
        username: String::from("bob"),
        email: String::from("bob@example.com"),
        sign_in_count: 1,
        active: true,
    };

    user1.email = String::from("bob2025@example.com");
}

Struct Update Syntax

You can create a new struct instance using most of the values from another instance.

fn main() {
    let user1 = User {
        username: String::from("carol"),
        email: String::from("carol@example.com"),
        sign_in_count: 1,
        active: true,
    };

    let user2 = User {
        email: String::from("carol2025@example.com"),
        ..user1
    };
}

Tuple Structs

Tuple structs are similar to regular structs, but their fields have no names—just types.

struct Color(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
}

Unit-Like Structs

Unit-like structs have no fields. They can be useful for implementing traits.

struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

Methods on Structs

You can define methods for structs using impl.

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 30, height: 50 };
    println!("The area of the rectangle is {}.", rect.area());
}

Summary

  • Structs group related data together.
  • Fields can be accessed and modified using dot notation.
  • Methods can be implemented for structs using impl.
  • Rust also supports tuple structs and unit-like structs for special use cases.

Structs are a core building block for modeling data in Rust programs.