Using Structs to Structure Related Data

Defining and Instantiating Structs

格式

1
2
3
4
struct Data_name {
data1: type1,
data2: type2,
}// 注意无;
1
2
3
4
5
6
struct Data {
name: String,
age: u32,
gender: bool,
balance: f32,
}

初始化一个 struct 对象

1
2
3
4
5
6
let user = Data {
name: String::from("SCUT"),
age: 1900,
gender: true,
balance: 0.0,
};

访问对象中的元素

1
println!("{} {} {} {}", user.name, user.age, user.gender, user.balance);

.. 语句

1
2
3
4
5
let user1 = Data {
name: String:: from("SCUT"),
gender: false,
..user // # 末尾无,
};

这样创建出来的 user1 ,未指出的变量会复制 user 中的,注意会有 move 语句,所有权可能会变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let user1 = Data {
name: String:: from("SCUT"),
gender: false,
..user // # 末尾无,
};
println!("{} {} {} {}", user1.name, user1.age, user1.gender, user1.balance);

// value borrowed here after move !! !! !!
let user2 = Data {
..user
};

println!("{} {} {} {}", user2.name, user2.age, user2.gender, user2.balance);
// println!("{} {} {} {}", user.name, user.age, user.gender, user.balance);// Error! value borrowed here after move

tuple struct

格式

1
struct Data_name(type1, type2,...); // 有;

创建对象

1
2
3
// tuple struct
struct Point(f32, f32);
let p = Point(0.0, 0.0);

访问元素

1
println!("{} {}", p.0, p.1);// 看成元组访问

An Example Program Using Structs

debug

在类前面加 #[derive(Debug)]

1
2
3
4
5
6
7
#[derive(Debug)]
struct Data {
name: String,
age: u32,
gender: bool,
balance: f32,
}

输出 类

{:?} 语法

1
2
3
println!("{:?}", user);
// output
// Data { name: "SCUT", age: 1900, gender: true, balance: 0.0 }

{:#?} 语法

1
2
3
4
5
6
7
8
9
10
println!("{:#?}", user);
// output
/*
Data {
name: "SCUT",
age: 1900,
gender: true,
balance: 0.0,
}
*/

格式不同

作为参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Rectangle {
width: f64,
height: f64,
}// 定义一个 rect

fn area(rect: &Rectangle) -> f64 {
rect.width * rect.height
}

let rect = Rectangle {
width: 3.1,
height: 4.1,
};
println!("{}", area(&rect));// 12.709999999999999 精度

Method Syntax

实现类中的函数

impl 语句 implementations

格式

1
2
3
4
5
6
7
8
9
impl srtuct_name {
fn func1(&self, ...) {

}

fn func2(...) {// 无 &self 为关联函数 通过 类名::func2() 调用

}
}

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#[derive(Debug)]
struct Rectangle {
width: f64,
height: f64,
}

impl Rectangle {
fn area(&self) -> f64 {
self.width * self.height
}

fn hold(&self, rect: &Rectangle) -> bool {
self.width >= rect.width && self.height >= rect.height
}

// 关联函数 无self
fn square(size: f64) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}
}

let r1 = Rectangle {
width: 10.0,
height: 20.0,
};

let r2 = Rectangle {
width: 11.0,
height: 21.0,
};

println!("{} {}", r1.hold(&r2), r2.hold(&r1));

let sq = Rectangle::square(10.0);
println!("{:#?}", sq);

以上就是 $Rust$ 的 $struct$

参考 The Rust Programming Language

更多内容参考我的 Blog