Structs - The Rust Reference

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

[items.struct]

# Structs

[items.struct.syntax]

Syntax
Struct →
StructStruct
| TupleStruct

StructStruct →
struct IDENTIFIER GenericParams? WhereClause? ( { StructFields? } | ; )

TupleStruct →
struct IDENTIFIER GenericParams? ( TupleFields? ) WhereClause? ;

StructFields → StructField ( , StructField )* ,?

StructField → OuterAttribute* Visibility? IDENTIFIER : Type

TupleFields → TupleField ( , TupleField )* ,?

TupleField → OuterAttribute* Visibility? Type

[items.struct.intro]

A struct is a nominal struct type defined with the keyword `struct`.

[items.struct.namespace]

A struct declaration defines the given name in the type namespace of the module or block where it is located.

An example of a `struct` item and its use:

    #![allow(unused)]
    fn main() {
    struct Point {x: i32, y: i32}
    let p = Point {x: 10, y: 11};
    let px: i32 = p.x;
    }

[items.struct.tuple]

A tuple struct is a nominal tuple type, and is also defined with the keyword `struct`. In addition to defining a type, it also defines a constructor of the same name in the value namespace. The constructor is a function which can be called to create a new instance of the struct. For example:

    #![allow(unused)]
    fn main() {
    struct Point(i32, i32);
    let p = Point(10, 11);
    let px: i32 = match p { Point(x, _) => x };
    }

[items.struct.unit]

A unit-like struct is a struct without any fields, defined by leaving off the list of fields entirely. Such a struct implicitly defines a constant of its type with the same name. For example:

    #![allow(unused)]
    fn main() {
    struct Cookie;
    let c = [Cookie, Cookie {}, Cookie, Cookie {}];
    }

is equivalent to

    #![allow(unused)]
    fn main() {
    struct Cookie {}
    const Cookie: Cookie = Cookie {};
    let c = [Cookie, Cookie {}, Cookie, Cookie {}];
    }

[items.struct.layout]

The precise memory layout of a struct is not specified. One can specify a particular layout using the `repr` attribute.