| # Structs |
| |
| r[items.struct] |
| |
| r[items.struct.syntax] |
| > **<sup>Syntax</sup>**\ |
| > _Struct_ :\ |
| > _StructStruct_\ |
| > | _TupleStruct_ |
| > |
| > _StructStruct_ :\ |
| > `struct` |
| > [IDENTIFIER] |
| > [_GenericParams_]<sup>?</sup> |
| > [_WhereClause_]<sup>?</sup> |
| > ( `{` _StructFields_<sup>?</sup> `}` | `;` ) |
| > |
| > _TupleStruct_ :\ |
| > `struct` |
| > [IDENTIFIER] |
| > [_GenericParams_]<sup>?</sup> |
| > `(` _TupleFields_<sup>?</sup> `)` |
| > [_WhereClause_]<sup>?</sup> |
| > `;` |
| > |
| > _StructFields_ :\ |
| > _StructField_ (`,` _StructField_)<sup>\*</sup> `,`<sup>?</sup> |
| > |
| > _StructField_ :\ |
| > [_OuterAttribute_]<sup>\*</sup>\ |
| > [_Visibility_]<sup>?</sup>\ |
| > [IDENTIFIER] `:` [_Type_] |
| > |
| > _TupleFields_ :\ |
| > _TupleField_ (`,` _TupleField_)<sup>\*</sup> `,`<sup>?</sup> |
| > |
| > _TupleField_ :\ |
| > [_OuterAttribute_]<sup>\*</sup>\ |
| > [_Visibility_]<sup>?</sup>\ |
| > [_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]. |
| |
| [_GenericParams_]: generics.md |
| [_OuterAttribute_]: ../attributes.md |
| [_Type_]: ../types.md#type-expressions |
| [_Visibility_]: ../visibility-and-privacy.md |
| [_WhereClause_]: generics.md#where-clauses |
| [`repr` attribute]: ../type-layout.md#representations |
| [IDENTIFIER]: ../identifiers.md |
| [constant]: constant-items.md |
| [struct type]: ../types/struct.md |
| [tuple type]: ../types/tuple.md |
| [type namespace]: ../names/namespaces.md |
| [value namespace]: ../names/namespaces.md |