结构体语法
一个结构体由几部分组成:
- 通过关键字 struct 定义
- 一个清晰明确的结构体 名称
- 几个有名字的结构体 字段
有几点值得注意:
1.初始化实例时,每个字段都需要进行初始化
2.初始化时的字段顺序不需要和结构体定义时的顺序一致
需要注意的是,必须要将结构体实例声明为可变的,才能修改其中的字段,Rust 不支持将某个结构体某个字段标记为可变。
当函数参数和结构体字段同名时,可以直接使用缩略的方式进行初始化,跟 TypeScript 中一模一样。
例如:
定义结构体:
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
实例化:
fn build_user(email: String, username: String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
语法表明
凡是我们没有显示声明的字段,全部从 user1 中自动获取。需要注意的是 …user1 必须在结构体的尾部使用。(两个结构体有相同的字段的时候,可以通过该方式实现给字符段赋值,需要注意的是该过程中发生了所有权转移,该行为之后,原先结构体中的未转移字段仍可以使用,转移后的不可以)。
把结构体中具有所有权的字段转移出去后,将无法再访问该字段,但是可以正常访问其它的字段。
使用 #[derive(Debug)] 对结构体进行了标记,这样才能使用 println!(“{:?}”, s); 的方式对其进行打印输出
单元结构体
果你定义一个类型,但是不关心该类型的内容, 只关心它的行为时,就可以使用 单元结构体
体的生命周期标注语法跟泛型参数语法很像,需要对生命周期参数进行声明 <'a>。该生命周期标注说明,结构体 ImportantExcerpt 所引用的字符串 str 必须比该结构体活得更久。
struct ImportantExcerpt<'a> {
part: &'a str,
}
Rust 使用 impl 来定义方法,
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
// new是Circle的关联函数,因为它的第一个参数不是self
// 这种方法往往用于初始化当前结构体的实例
fn new(x: f64, y: f64, radius: f64) -> Circle {
Circle {
x: x,
y: y,
radius: radius,
}
}
// Circle的方法,&self表示借用当前的Circle结构体
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
使用方法代替函数有以下好处:
- 不用在函数签名中重复书写 self 对应的类型
- 代码的组织性和内聚性更强,对于代码维护和阅读来说,好处巨大