1. 结构体
1. 什么是结构体?
结构体(struct)是一种自定义数据类型,类似面向对象语言中的对象去命名和包装多个属性。
2. 语法
rust
struct User{
email:String,
active:bool,
count:u8
}3. 使用结构体创建实例
以结构体名开始,为其内部每个属性声明具体的值。实例中字段的顺序不需要和结构体定义时的顺序一致。
rust
let mut tom = User{
email:String::from("[email protected]"),
active:true,
count:12
}4. 读取、修改结构体实例中的属性值。
使用. 获取实例属性;修改实例属性的前提是该实例为mut。
rust
println("tom's mail :{}",tom.email) //[email protected]
time.count = 10;5. 结构体实例作为函数返回值
隐式的在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。
rust
fn init_info(email:String::from("[email protected]")) -> User{
User{
email, //当参数名和属性同名时可简写
active:true,
count:12
}
}6. 结构体更新语法
结构体语法允许从其他实例中获取属性值,来创建新的实例,赋值给相同属性名的属性。
rust
let jack = User{
email:tom.email,
active:tome.active,
count:6
}观察发现jack只有count和tom不一样,
rust
let jack = User{
count:6,
...tom
}
//展开旧实例的属性,同时忽略👆的key对应的属性2. 元组结构体
元组结构体有着结构体名称提供的含义,但没有具体的字段名,只有字段的类型。要定义元组结构体,以 struct 关键字和结构体名开头并后跟元组中的类型。
rust
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
fn main() {
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
}注意 ❗
black和origin值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段有着相同的类型。例如,一个获取Color类型参数的函数不能接受Point作为参数,即便这两个类型都由三个i32值组成。在其他方面,元组结构体实例类似于元组:可以将其解构为单独的部分,也可以使用.后跟索引来访问单独的值,
3. 类单元结构体
没有任何字段的结构体被称为类单元结构体。用于在某个类型上实现 trait 但不需要在类型中存储数据。
rust
struct AlwaysEqual;
fn main() {
let subject = AlwaysEqual;
}4. 使用impl在架构体上创建方法
方法与函数类似,但并不是函数。其传递&self参数(本质是 self:&Self 的缩写),在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 self 的Self 类型的参数,使用&self的原因是并不想获取所有权。
rust
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn width(&self) -> bool {
self.width > 0
}
//与字段同名的方法将被定义为只返回字段中的值,而不做其他事情。这样的方法被称为 getters,Getters 很有用,因为你可以把字段变成私有的,但方法是公共的,这样就可以把对字段的只读访问
fn height(&self) -> u32{
self.height
}
}
fn main() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
if rect1.width() {
println!("The rectangle has a nonzero width; it is {}", rect1.width);
}
}