结构体

语法
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

结构体 (struct) 是一种名义上的结构体类型,使用关键字 struct 定义。

结构体声明在它所在的模块或块的类型命名空间中定义了给定的名字。

struct 项及其用法示例

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

元组结构体 (tuple struct) 是一种名义上的元组类型,也使用关键字 struct 定义。除了定义类型之外,它还在值命名空间中定义了一个同名的构造函数。这个构造函数是一个可以被调用以创建结构体新实例的函数。例如

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

单元结构体 (unit-like struct) 是一种没有任何字段的结构体,通过完全省略字段列表来定义。这种结构体隐式定义了一个同名且类型为自身的常量。例如

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

等同于

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

结构体的精确内存布局是未指定的。可以使用repr 属性来指定特定的布局。