Skip to content

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);
}

注意 ❗

blackorigin 值的类型不同,因为它们是不同的元组结构体的实例。你定义的每一个结构体有其自己的类型,即使结构体中的字段有着相同的类型。例如,一个获取 Color 类型参数的函数不能接受 Point 作为参数,即便这两个类型都由三个 i32 值组成。在其他方面,元组结构体实例类似于元组:可以将其解构为单独的部分,也可以使用 . 后跟索引来访问单独的值,

3. 类单元结构体

没有任何字段的结构体被称为类单元结构体。用于在某个类型上实现 trait 但不需要在类型中存储数据。

rust
struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

4. 使用impl在架构体上创建方法

方法与函数类似,但并不是函数。其传递&self参数(本质是 self:&Self 的缩写),在一个 impl 块中,Self 类型是 impl 块的类型的别名。方法的第一个参数必须有一个名为 selfSelf 类型的参数,使用&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);
    }
}