Rust 入门 结构体

结构体

认识结构体

  • 结构体(struct) 是一个自定义数据类型
  • 允许你命名和包装多个相关的值, 形成一个有意义的组合

定义结构体

  • 使用struct关键字定义一个结构体
  • 结构体的成员叫做字段(field)

例子

struct User {
    username: String,
    password: String,
    email: String,
    age: u32,
}

实例化结构体

  • 必须为每个字段指定具体的值
  • 无需按照字段声明的顺序进行指定

例子

let user = User {
    username: String::from("admin"),
    password: String::from("Admin&rust"),
    email: String::from("admin@qq.com"),
    age: 18,
};

访问结构体字段

  • 使用点标记法获取字段
  • 如果需要改变结构体内的值, 我们需要将结构体声明为可变的

例子

let mut user = User {
    username: String::from("admin"),
    password: String::from("Admin&rust"),
    email: String::from("admin@qq.com"),
    age: 18,
};
user.email = String::from("admin@139.com");

简写语法

  • 变量与字段同名时: 可以省略字段名
fn build_user(username: &str, password: &str, email: &str, age: u32) -> User {
    User {
        username: String::from(username),
        password: String::from(password),
        email: String::from(email),
        age,
    }
}
  • 从其他实例创建实例
let user = build_user("admin", "Admin&rust", "admin@qq.com", 18);
// 结构体更新语法
let user2 = User {
    username: String::from("admin2"),
    password: String::from("admin2&rust"),
    ..user
};

元组结构体

  • 类似于元组的结构体就叫做元组结构体(tuple struct)
  • 元组结构体拥有名字, 字段(元素)没有名字

例子

struct Color(u8, u8, u8, u8);

fn main() {
    let red = Color(255, 255, 0, 0);
}

类单元结构体

  • 没有任何字段的控结构体叫做类单元结构体(unit-like structs)
  • 类单元结构体适用于在某个类型上实现某个trait 但是没有想要储存的数据

例子

struct Unit{}

fn main() {
    let u = Unit{};
}

结构体方法(重点)

  • 方法和函数几乎完全一样, 这里仅说明不同之处:
    • 方法是在结构体(menu/trait) 对象的上下文中定义的
    • 方法的第一个参数为 self ,self表示当前的struct实例
  • 定义方法需要在结构体的实现块(implementation chunk) 中
  • 方法签名中使用&self或者self来替代结构体实例

例子

struct Person {
    name: String,
    age: u8,
}

impl Person {
    fn laugh(&self) {
        println!("{} 发出了笑声", self.name);
    }
}

fn main() {
    let person = Person { name: String::from("Tom"), age: 18 };
    person.laugh();
}

结构体关联函数

  • 在实现块中定义的函数叫做关联函数
  • 关联函数通常用于构造器
  • 关联函数使用::进行访问

例子

struct Person {
    name: String,
    age: u8,
}

impl Person {
    fn laugh(&self) {
        println!("{} 发出了笑声", self.name);
    }

    fn new(name: &str, age: u8) -> Person {
        Person { name: String::from(name), age }
    }
}

fn main() {
    let person = Person::new("Tom", 18);
    person.laugh();
}

结构体使用实例

// demo 2
struct Rect {
    width: u32,
    length: u32,
}

impl Rect {
    fn new(width: u32, length: u32) -> Rect {
        Rect { width, length }
    }

    fn area(&self) -> u32 {
        self.width * self.length
    }
}

fn main() {
    // demo 1
    let w = 30;
    let l = 50;
    let s = area(w, l);
    println!("长方形的面积: {}", s);
    
	// demo 2
    let rect = Rect::new(30, 50);
    println!("长方形的面积: {}", rect.area());
}

// demo 1
fn area(width: u32, length: u32) -> u32 {
    width * length
}

虽然运行结果相同, 但是使用结构体封装的形式更符合模块化标准

如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-06-22 12:51  Delayer  阅读(178)  评论(0编辑  收藏  举报