Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。
元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫做"字段"。
// 引入调试库用于输出结构体
#[derive(Debug)]
struct Person {
name: String,
age: u8,
}
// 结构体 impl 块可以写几次,效果相当于它们内容的拼接!
impl Person {
// 结构体方法
fn sayhello(&self) {
println!("Hello I am {}, {}", self.name, self.age);
}
// 结构体关联函数, 没有 &self 参数, 不依赖实例
fn create(name: String, age: u8) -> Person {
// 当 value 和 key 名称相同, 可简写
let p = Person { name: name, age };
p
}
}
fn main() {
let mut p1 = Person::create("Jim".to_string(), 18);
p1.age += 1;
p1.sayhello();
// 更新部分, 其余一致
let p2 = Person {
name: "Tom".to_string(),
..p1
};
// 使用占位符 {:#?} 或 {:?} 输出结构体
println!("{:#?}", p2);
}
struct Color(i32, i32, i32);
let black = Color(0, 0, 0);
单元类结构是没有任何字段的结构体
struct Unit;
let u = Unit;
结构体必须掌握字段值所有权,因为结构体失效的时候会释放所有字段。这就是为什么本章的案例中使用了 String 类型而不使用 &str 的原因。
但这不意味着结构体中不能定义引用型字段,这需要通过"生命周期"机制来实现。但现在还难以说明"生命周期"概念,所以只能在后面章节说明。