Common Info

Define and create:

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

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

Using in functions:

fn build_user(email: String, username: String) -> User {
    User {
        active: true,
        username,       // Short form
        email,
        sign_in_count: 1,
    }
}

Create new instance using another:

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

Structs without property names:

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

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

Without fields:

struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

Structs and ownerships

The following code won’t work:

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

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

Methods

struct Rectangle {
    width: u32,
    height: u32
}

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

let rect1 = Rectangle {
    width: 30,
    height: 50,
};

println!(
    "The area of the rectangle is {} square pixels.",
    rect1.area()
);

Associated Functions

impl Rectangle {
    fn square(size: u32) -> Self {
        Self {
            width: size,
            height: size,
        }
    }
}

let sq = Rectangle::square(12);