Rust 结构体或 struct 是一种用户定义的复合数据类型,用于将不同类型的数据一起存储。
假设我们要存储一个人的姓名、年龄和身高。为此,我们可以为每个属性/字段创建变量。
let personName: String = String::from("John Doe");
let personAge: u8 = 18;
let personHeight: u8 = 178;
这种方法的缺点是我们必须单独维护所有这些变量。要存储多个人这些字段,我们将不得不为每个人创建不同的变量。
相反,我们可以创建一个结构体,将所有字段作为一个单元存储在一起。例如,
struct Person {
name: String,
age: u8,
height: u8
}
在 Rust 中定义结构体
在 Rust 中,我们使用 struct
关键字来定义结构体。结构体的语法是
struct struct_name {
field1: data_type,
field2: data_type,
field3: data_type
}
这里,
struct
- 定义结构体的关键字struct_name
- 结构体的名称field1: data_type/field2: data_type
- 结构体内部字段的名称和数据类型。
让我们看一个例子。
struct Person {
name: String,
age: u8,
height: u8
}
在这里,我们定义了一个名为 Person
的结构体。它包含三个字段
name
- 数据类型为String
age
- 数据类型为u8
height
- 数据类型为u8
实例化 Rust 结构体
要在 Rust 中使用结构体,我们首先必须创建结构体的实例。例如,
// define a structure
struct Person {
name: String
age: u8,
height: u8
}
// create an instance of Person struct
let person1 = Person {
...
};
在这里,Person {...}
创建了一个 Person 结构体 的实例,我们将其赋值给了 person1 变量。
我们也可以在创建实例时为结构体字段赋值。例如,
let person1 = Person {
name: String::from("John Doe"),
age: 18,
height: 178
};
在这里,我们初始化了 Person 结构体的 name
、age
和 height
字段的值。此初始化结构体字段值的方法称为结构体实例化。
注意: 结构体定义是一个模板,结构体实例用数据填充该模板。
访问结构体的字段
我们可以使用结构体实例和点 .
符号来访问结构体中字段的值。例如,
fn main() {
// define a Person struct
struct Person {
name: String,
age: u8,
height: u8
}
// instantiate Person struct
let person = Person {
name: String::from("John Doe"),
age: 18,
height: 178
};
// access value of name field in Person struct
println!("Person name = {}", person.name);
// access value of age field in Person struct
println!("Person age = {}", person.age);
// access value of height field in Person struct
println!("Person height = {}", person.height);
}
输出
Person name = John Doe Person age = 18 Person height = 178
这里,
person.name
- 读取 Person 结构体的name
字段 (John Doe
)person.age
- 读取age
字段 (18
)person.height
- 读取height
字段 (178
)
解构 Rust 结构体的字段
解构是将数据类型(数组、元组等)的字段分解为更小变量的过程。我们可以在 Rust 中将结构体字段分解为更小的变量。
假设我们有一个结构体和一个结构体实例,
struct Person {
name: String,
age: u8,
height: u8
}
let person = Person {
name: String::from("John Doe"),
age: 18,
height: 178
};
我们现在可以使用以下方式进行解构
// destructuring the Person struct
let Person { name, age, height } = person;
现在,我们直接使用字段名来访问 name
、age
和 height
字段
name
而不是person.name
age
而不是person.age
height
而不是person.height
但是,您应该注意,解构时的变量名应与字段名相同。
示例:解构结构体字段
fn main() {
// define a Person struct
struct Person {
name: String,
age: u8,
height: u8
}
// instantiate Person struct
let person = Person {
name: String::from("John Doe"),
age: 18,
height: 178
};
// destructure Person struct into name, age and height variables
let Person { name, age, height } = person;
println!("Person name = {}", name);
println!("Person age = {}", age);
println!("Person height = {}", height);
}
输出
Person name = John Doe Person age = 18 Person height = 178
这里,解构是通过此表达式完成的,
let Person { name, age, height } = person;
表达式的左侧包含声明,表达式的右侧是结构体实例。
在表达式的左侧,我们为具有字段 name
、age
和 height
的 Person
结构体进行了 let
声明。在表达式的右侧,我们分配了 Person
的实例化结构体。
结果,我们获取了该人员的 name
、age
和 height
并将其打印到屏幕上。
常见问题
要创建可变的 struct
,我们在声明结构体变量时使用 mut
关键字。例如,
fn main() {
// define a Point struct
struct Point {
x: i32,
y: i32,
}
// instantiate Point struct to a mutable structure variable
let mut point = Point { x: 0, y: 0 };
println!("Before change:");
println!("Point x = {}", point.x);
println!("Point y = {}", point.y);
// change the value of x field in mutable point struct
point.x = 5;
println!();
println!("After change:");
println!("Point x = {}", point.x);
println!("Point y = {}", point.y);
}
输出
Before change: Point x = 0 Point y = 0 After change: Point x = 5 Point y = 0
元组结构体是 元组
和 结构体
的混合体。所有元组结构体都有名称,但它们的字段没有。例如,
fn main() {
// a tuple struct
#[derive(Debug)]
struct Point(i32, i32);
// instantiating a tuple struct with values
let point = Point(1, 2);
println!("{:?}", point);
}
输出
Point(1, 2)
在这里,struct Point(i32, i32)
是一个元组结构体,包含两个 i32
类型的字段。
注意: 在结构体定义上方添加 #[derive(Debug)]
以允许 Rust 打印整个结构体。