Keyword struct

source ·
Expand description

由其他类型组成的类型。

Rust 中的结构体有三种风格:带有命名字段的结构体,元组结构体和单元结构体。

struct Regular {
    field1: f32,
    field2: String,
    pub field3: bool
}

struct Tuple(u32, String);

struct Unit;
Run

常规结构体是最常用的。它们中定义的每个字段都有一个名称和类型,一旦定义,就可以使用 example_struct.field 语法进行访问。 结构体的字段共享其可变性,因此 foo.bar = 2; 仅在 foo 是可变的时才有效。 在字段中添加 pub 使其可以在其他模块中的代码中看到,并且可以直接对其进行访问和修改。

元组结构体与常规结构体相似,但其字段没有名称。它们像元组一样使用,可以通过 let TupleStruct(x, y) = foo; 语法进行解构。 为了访问单个变量,使用与常规元组相同的语法,即 foo.0foo.1 等,从零开始。

单元结构体最常用作标记。它们的大小为零字节,但是与空的枚举不同,它们可以实例化,使其与单元类型 () 同构。 当您需要在某物上实现 trait 而不需要在其中存储任何数据时,单元结构体非常有用。

Instantiation

可以用不同的方式实例化结构体,所有方式都可以根据需要进行混合和匹配。 生成新结构体的最常见方法是通过诸如 new() 之类的构造函数方法,但是当该方法不可用 (或者您正在编写构造函数本身) 时,将使用结构体字面量语法:

let example = Foo {
    field1: 42.0,
    field2: "blah".to_string(),
    etc: true,
};
Run

当您对结构体的所有字段都可见时,才可以使用结构体字面量语法直接实例化结构体。

提供了一些快捷方式,以使编写构造函数更加方便,其中最常见的是缩写词初始化简写语法。 当变量和字段具有相同的名称时,可以将分配从 field: field 简化为 field。 假设的构造函数的以下示例说明了这一点:

struct User {
    name: String,
    admin: bool,
}

impl User {
    pub fn new(name: String) -> Self {
        Self {
            name,
            admin: false,
        }
    }
}
Run

结构体实例化的另一种快捷方式是可用的,当您需要制作一个具有与大多数以前相同类型的结构体相同的值的新结构体时,可以使用该快捷方式,称为结构体更新语法:

let updated_thing = Foo {
    field1: "a new value".to_string(),
    ..thing
};
Run

元组结构的实例化方式与元组本身相同,只是将结构的名称作为前缀: Foo(123, false, 0.1)

空结构体仅用其名称实例化,不需要其他任何东西。让事情 = EmptyStruct;

样式约定

结构体总是以 UpperCamelCase 书写,很少有例外。 虽然可以省略结构体的字段列表中的结尾逗号,但为了方便在行中添加和删除字段,通常将其保留下来。

有关结构体的更多信息,请查看 Rust 书reference