25-结构体

结构体 — Easy Rust 中文译本

译文 · 基于 Easy Rust

原文链接: https://dhghomon.github.io/easy_rust/Chapter_24.html

中文参考:kumakichi/easy_rust_chs

结构体

有了结构体,你可以创建自己的类型。在 Rust 中,你会一直使用结构体,因为它们非常方便。结构体是用关键字 struct 创建的。结构体的名称应该用UpperCamelCase(每个字用大写字母,不要用空格)。如果你用全小写的结构,编译器会告诉你。

有三种类型的结构。一种是 “单元结构”。单元的意思是 “没有任何东西”。对于一个单元结构,你只需要写名字和一个分号。

1
2
struct FileDirectory;
fn main() {}

接下来是一个元组结构,或者说是一个未命名结构。之所以是 “未命名”,是因为你只需要写类型,而不是字段名。当你需要一个简单的结构,并且不需要记住名字时,元组结构是很好的选择。

1
2
3
4
5
6
struct Colour(u8, u8, u8);

fn main() {
    let my_colour = Colour(50, 0, 50); // 用 RGB(红、绿、蓝)构造颜色
    println!("The second part of the colour is: {}", my_colour.1);
}

这时打印出The second part of the colour is: 0。

第三种类型是命名结构。这可能是最常见的结构。在这个结构中,你在一个 {} 代码块中声明字段名和类型。请注意,在命名结构后面不要写分号,因为后面有一整个代码块。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
struct Colour(u8, u8, u8); // 声明同一个 Colour 元组结构体

struct SizeAndColour {
    size: u32,
    colour: Colour, // 并放入我们新的具名字段结构体
}

fn main() {
    let my_colour = Colour(50, 0, 50);

    let size_and_colour = SizeAndColour {
        size: 150,
        colour: my_colour
    };
}

在一个命名结构中,你也可以用逗号来分隔字段。对于最后一个字段,你可以加一个逗号或不加–这取决于你。SizeAndColour 在 colour 后面有一个逗号。

1
2
3
4
5
6
7
8
struct Colour(u8, u8, u8); // 声明同一个 Colour 元组结构体

struct SizeAndColour {
    size: u32,
    colour: Colour, // 并放入我们新的具名字段结构体
}

fn main() {}

但你不需要它。但总是放一个逗号可能是个好主意,因为有时你会改变字段的顺序。

1
2
3
4
5
6
7
8
struct Colour(u8, u8, u8); // 声明同一个 Colour 元组结构体

struct SizeAndColour {
    size: u32,
    colour: Colour // 这里没有逗号
}

fn main() {}

然后我们决定改变顺序…

1
2
3
4
5
6
struct SizeAndColour {
    colour: Colour // ⚠️ 糟糕!现在这里没有逗号了。
    size: u32,
}

fn main() {}

但无论哪种方式都不是很重要,所以你可以选择是否使用逗号。

我们创建一个Country结构来举例说明。Country结构有population、capital和leader_name三个字段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
struct Country {
    population: u32,
    capital: String,
    leader_name: String
}

fn main() {
    let population = 500_000;
    let capital = String::from("Elista");
    let leader_name = String::from("Batu Khasikov");

    let kalmykia = Country {
        population: population,
        capital: capital,
        leader_name: leader_name,
    };
}

你有没有注意到,我们把同样的东西写了两次?我们写了population: population、capital: capital和leader_name: leader_name。实际上,你不需要这样做:如果字段名和变量名是一样的,你就不用写两次。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
struct Country {
    population: u32,
    capital: String,
    leader_name: String
}

fn main() {
    let population = 500_000;
    let capital = String::from("Elista");
    let leader_name = String::from("Batu Khasikov");

    let kalmykia = Country {
        population,
        capital,
        leader_name,
    };
}
最后修改 August 21, 2026: 更新 (76fc81a2e)