Rust Struct结构体详解
结构体是Rust语言中非常重要和常用的数据类型,用来表示一组相关数据的集合。结构体可以包含不同类型的数据,比如整形、浮点数、字符串等等,也可以包含其他结构体。在该攻略中,我们将详细讲解Rust结构体的用法和注意事项。
定义结构体
结构体可以通过struct
关键字定义,在结构体定义中需要指定结构体的字段及其类型。结构体中的字段可以被访问和修改。
示例代码:
struct Person {
name: String,
age: u32,
address: String,
}
上面的代码中定义了一个Person结构体,包含name、age和address三个字段。其中name和address是String类型的变量,age是一个无符号整数。
初始化结构体
在Rust中,可以用大括号初始化结构体。大括号中的字段名必须与结构体定义中的字段名对应。可以通过name: value的形式初始化结构体中的每个字段。
示例代码:
let person = Person {
name: String::from("Alice"),
age: 20,
address: String::from("China"),
};
上面的代码中,初始化了一个Person结构体,对于name和address字段使用了String::from()
方法,实现了动态分配内存。
访问结构体的字段
访问结构体的字段非常简单。可以使用.号
后跟字段名来访问。
示例代码:
let person = Person {
name: String::from("Alice"),
age: 20,
address: String::from("China"),
};
println!("name is {}", person.name);
上面的代码中,通过.号
来访问Person
结构体中的name
字段,并将其打印出来。
修改结构体的字段
结构体中的字段默认情况下是不可变的,无法修改。必须使用mut
关键字将其标记为可变的才能修改结构体中的字段。
示例代码:
let mut person = Person {
name: String::from("Alice"),
age: 20,
address: String::from("China"),
};
person.address = String::from("Japan");
上面的代码中,定义了一个可变的Person结构体,并使用.号
来访问和修改了它的address
字段。
实现结构体中的方法
Rust允许在结构体中定义方法。方法可以被结构体的实例调用。方法是结构体中的关联函数,它们使用impl
关键字实现。
示例代码:
struct Person {
name: String,
age: u32,
address: String,
}
impl Person {
fn new(name: String, age: u32, address: String) -> Self {
Self {
name,
age,
address,
}
}
fn say_hello(&self) {
println!("Hello, my name is {}", self.name);
}
}
上面的代码中,定义了一个Person
结构体和两个方法。new
方法用于初始化Person
实例,say_hello
方法输出一段问候语。注意,方法第一个参数必须是self
或其引用,表示将要调用方法的结构体实例。
结构体之间的嵌套
在结构体内部,可以嵌套其他结构体。这是非常常见和有用的数据结构模型。
示例代码:
struct Address {
country: String,
city: String,
}
struct Person {
name: String,
age: u32,
address: Address,
}
let person = Person {
name: String::from("Alice"),
age: 20,
address: Address {
country: String::from("China"),
city: String::from("Beijing"),
},
};
上面的代码中,定义了两个结构体,一个是Address
,一个是Person
。并在Person
结构体中包含了一个Address
结构体。
示例一
struct Triangle {
a: f64,
b: f64,
c: f64,
}
impl Triangle {
fn new(a: f64, b: f64, c: f64) -> Option<Self> {
if a + b > c && a + c > b && b + c > a {
Some(Triangle { a, b, c })
} else {
None
}
}
fn perimeter(&self) -> f64 {
self.a + self.b + self.c
}
fn area(&self) -> f64 {
let p = self.perimeter() / 2.0;
(p * (p - self.a) * (p - self.b) * (p - self.c)).sqrt()
}
}
fn main() {
let t = Triangle::new(3.0, 4.0, 5.0).unwrap();
println!("Perimeter = {}", t.perimeter());
println!("Area = {}", t.area());
}
上述代码实现了一个Triangle
结构体,它有三个字段a
、b
、c
表示三角形的三个边长。通过impl
关键字实现了new
方法,用于创建一个合法的三角形。如果给定的边长无法构成三角形,则返回None
。通过perimeter
方法计算三角形的周长,通过area
方法计算三角形的面积。
示例二
struct Circle {
radius: f64,
}
impl Circle {
fn new(radius: f64) -> Self {
Circle { radius }
}
fn diameter(&self) -> f64 {
self.radius * 2.0
}
fn circumference(&self) -> f64 {
self.diameter() * std::f64::consts::PI
}
fn area(&self) -> f64 {
self.radius * self.radius * std::f64::consts::PI
}
}
fn main() {
let c = Circle::new(10.0);
println!("Diameter = {}", c.diameter());
println!("Circumference = {}", c.circumference());
println!("Area = {}", c.area());
}
上述代码实现了一个Circle
结构体,它有一个字段radius
表示圆的半径。通过impl
关键字实现了new
方法,用于创建一个合法的圆。通过diameter
方法计算圆的直径,通过circumference
方法计算圆的周长,通过area
方法计算圆的面积。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Rust Struct结构体详解 - Python技术站