| r[items.struct] |
| # Structs |
| |
| r[items.struct.syntax] |
| ```grammar,items |
| 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 |
| ``` |
| |
| r[items.struct.intro] |
| A _struct_ is a nominal [struct type] defined with the keyword `struct`. |
| |
| r[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: |
| |
| ```rust |
| struct Point {x: i32, y: i32} |
| let p = Point {x: 10, y: 11}; |
| let px: i32 = p.x; |
| ``` |
| |
| r[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: |
| |
| ```rust |
| struct Point(i32, i32); |
| let p = Point(10, 11); |
| let px: i32 = match p { Point(x, _) => x }; |
| ``` |
| |
| r[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: |
| |
| ```rust |
| struct Cookie; |
| let c = [Cookie, Cookie {}, Cookie, Cookie {}]; |
| ``` |
| |
| is equivalent to |
| |
| ```rust |
| struct Cookie {} |
| const Cookie: Cookie = Cookie {}; |
| let c = [Cookie, Cookie {}, Cookie, Cookie {}]; |
| ``` |
| |
| r[items.struct.layout] |
| The precise memory layout of a struct is not specified. One can specify a |
| particular layout using the [`repr` attribute]. |
| |
| [`repr` attribute]: ../type-layout.md#representations |
| [constant]: constant-items.md |
| [struct type]: ../types/struct.md |
| [tuple type]: ../types/tuple.md |
| [type namespace]: ../names/namespaces.md |
| [value namespace]: ../names/namespaces.md |