Rust——结构的概念
结构基本上是用户定义的类型,主要用于将不同的数据类型组合在一起。它克服了传统数组只能包含相同数据类型元素的限制。一个结构本身也可以包含一个结构。在 Rust 中,结构类似于元组,但结构元素很容易访问,因为在元组的情况下它们被命名而不是索引。
在 Rust 中,结构分为三种类型
- 典型的 C 类结构
- 元组结构:它类似于元组,其中字段未命名但具有附加功能。
- 单元结构:这些是无字段结构,即不包含数据。在我们只想在某些类型上实现 trait 但没有数据的情况下,它很有用。
如何定义结构?
结构由 struct 关键字后跟密钥对元素定义。
Rust
// typical c struct
struct Student{
name:String,
roll: u64,
dept: String,
}
// A unit struct
struct Unit;
// A tuple struct
struct Pair(i32, f32);
Rust
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
fn main() {
let student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
};
println!("{:?}",student1.name);
}
Rust
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
fn main() {
let mut student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
};
student1.roll=60;
println!("{:?}",student1.roll);
}
Rust
#[derive(Debug)]
struct Addr{
loc:String,
pin:u64,
}
struct Student{
name:String,
roll: u64,
dept: String,
addr: Addr,
}
fn main() {
let add1=Addr{
loc: String::from("world"),
pin:700001,
};
let student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
addr:add1,
};
println!("{:?}",student1.addr.pin);
}
Rust
#[derive(Debug)]
struct Triangle {
base: f64,
height: f64,
}
impl Triangle {
fn area(&self) -> f64 {
self.base * self.height * 0.5
}
}
fn main() {
let tri1 = Triangle {
base: 3.0,
height: 5.0,
};
println!("The area of the triangle is = {}",tri1.area());
}
在这里,我们使用 struct 关键字及其元素——“name”、“roll”和“dept”以及它们预期的数据类型定义了一个 Student 结构。我们还定义了单元结构和元组结构。当我们定义结构时,没有分配内存给它。只有当我们初始化它时,它才会被分配。
现在,我们将初始化我们的 Student 结构。使用“.”访问结构元素。 (点)运算符。
锈
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
fn main() {
let student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
};
println!("{:?}",student1.name);
}
输出:
"Prem"
更新已定义结构的值
由于我们想要更新一个结构的值,所以我们用来初始化它的变量,即上面例子中的 student1 应该声明为 mut(一个可以更新的变量),否则默认情况下它是不可变的(不能更新)。
锈
#[derive(Debug)]
struct Student{
name:String,
roll: u64,
dept: String,
}
fn main() {
let mut student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
};
student1.roll=60;
println!("{:?}",student1.roll);
}
输出:
60
嵌套结构
如前所述,我们可以在另一个结构中使用一个结构。让我们来看看。
锈
#[derive(Debug)]
struct Addr{
loc:String,
pin:u64,
}
struct Student{
name:String,
roll: u64,
dept: String,
addr: Addr,
}
fn main() {
let add1=Addr{
loc: String::from("world"),
pin:700001,
};
let student1 = Student{
name: String::from("Prem"),
roll: 50,
dept:String::from("CSE"),
addr:add1,
};
println!("{:?}",student1.addr.pin);
}
输出:
700001
这里我们尝试将地址结构添加到学生结构中。需要注意的一件事是 addr 结构应该在 student 结构之前定义,在初始化期间也是如此。请注意用于访问作为另一个结构的一部分的结构的元素的方法。为此,我们在 student1.addr.pin 中使用了两次点运算符。
定义结构的方法
锈
#[derive(Debug)]
struct Triangle {
base: f64,
height: f64,
}
impl Triangle {
fn area(&self) -> f64 {
self.base * self.height * 0.5
}
}
fn main() {
let tri1 = Triangle {
base: 3.0,
height: 5.0,
};
println!("The area of the triangle is = {}",tri1.area());
}
输出:
The area of the triangle is = 7.5
我们启动了一个 impl(实现)块,在其中定义了三角形的方法区。我们将结构体实例的地址传递给函数并使用 self 来引用它。