For now, this reference is a best-effort document. We strive for validity and completeness, but are not yet there. In the future, the docs and lang teams will work together to figure out how best to do this. Until then, this is a best-effort attempt. If you find something wrong or missing, file an issue or send in a pull request.

Structs

Syntax
Struct :
      StructStruct
   | TupleStruct

StructStruct :
   struct IDENTIFIER  Generics? WhereClause? ( { StructFields? } | ; )

TupleStruct :
   struct IDENTIFIER  Generics? ( TupleFields? ) WhereClause? ;

StructFields :
   StructField (, StructField)\* ,?

StructField :
   OuterAttribute\*
   Visibility?
   IDENTIFIER : Type

TupleFields :
   TupleField (, TupleField)\* ,?

TupleField :
   OuterAttribute\*
   Visibility?
   Type

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

An example of a struct item and its use:


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

A tuple struct is a nominal tuple type, also defined with the keyword struct. For example:


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

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_variables)]
#fn main() {
struct Cookie;
let c = [Cookie, Cookie {}, Cookie, Cookie {}];
#}

is equivalent to


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

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