侧边栏壁纸
博主头像
喵记博主等级

行动起来,活在当下

  • 累计撰写 18 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Rust(八):结构体

张秋平
2024-02-12 / 0 评论 / 0 点赞 / 23 阅读 / 4628 字

Rust 中的结构体(struct)

结构体的定义

  • 实例化结构体时,必须为结构体中的每一个字段都进行赋值,但是可以不按照字段定义时的顺序进行赋值

  • 一旦结构体的实例是可变的,那么实例中的所有字段都是可变的

  • 当字段名与字段值对应的变量名相同时,在初始化时可以使用简写

  • 定义时,最后一个字段后可以添加逗号也可以不添加逗号,但推荐添加上

fn main() {
	// 在使用 struct 进行实例化时,可以不按照定义时字段的顺序进行赋值
	// 初始化时必须为每一个字段都进行赋值
    let user = User{
        name: String::from("Zhangsan"),
        age: 18,
        active: true
    };
    let user_name = user.name.as_str();
    let user_age = user.age;
    let user_active = user.active;
    println!("user name: {}", user_name);
    println!("user age: {}", user_age);
    println!("user active: {}", user_active);

    // 也可以通过对 struct 添加 #[derive(Debug)] 特性来打印 struct 信息
    println!("{:?}", user);
}

#[derive(Debug)]	// 添加该行注解可以通过 println!("{:?}", user) 进行便捷打印
struct User{
    name: String,
    age: i32,
    active: bool,
}

/* 输出:
user name: Zhangsan
user age: 18
user active: true
User { name: "Zhangsan", age: 18, active: true }
*/

使用简写定义

fn main() {
    let user = build_user(String::from("Zhangsan"), 18, true);

    println!("user name: {}", user.name);
    println!("user age: {}", user.age);
    println!("user active: {}", user.active);
}

struct User{
    name: String,
    age: i32,
    active: bool,
}

fn  build_user(name: String, age: i32, active: bool) -> User {
    User{
        name,
        age,
        active,
    }
}

/* 输出:
user name: Zhangsan
user age: 18
user active: true
*/

结构体的更新语法

  • 使用一个已有结构体来实例化另一个结构体

fn main() {
    let user = build_user(String::from("Zhangsan"), 18, true);

    let user2 = User {
        name: String::from("Lisi"),
        ..user
    };

    println!("user name: {}", user.name);
    println!("user2 name: {}", user2.name);
    println!("user2 age: {}", user.age);
    println!("user2 active: {}", user2.active);
}

struct User{
    name: String,
    age: i32,
    active: bool,
}

fn  build_user(name: String, age: i32, active: bool) -> User {
    User{
        name,
        age,
        active,
    }
}

/* 输出:
user name: Zhangsan
user2 name: Lisi
user2 age: 18
user2 active: true
*/

元组结构体

  • 需要注意的是,通过元组结构体实例化出来的不同的对象,类型也不相同

fn main() {
    let black = Color(0, 0, 0);
    let white = Color(255, 255, 255);

    println!("black: {}, {}, {}", black.0, black.1, black.2);
    println!("white: {}, {}, {}", white.0, white.1, white.2);
}

struct Color(i32, i32 ,i32);

/* 输出:
black: 0, 0, 0
white: 255, 255, 255
*/

结构体方法

  • 通过在impl 结构体名字 {} 中定义结构体的方法

  • 结构体方法的第一个参数是self, &self 或 &mut self 实例化对象本身的引用

  • 通过实例.方法名的方式来调用结构体方法

  • Rust 没有-> 运算发,因为rust会自动引用或解引用

  • 允许使用多个impl 来定义结构体方法或关联函数

fn main() {
    let user = User {
        name: String::from("Zhangsan"),
        age: 18,
        active: true,
    };

    user.info();
}

struct User {
    name: String,
    age: i32,
    active: bool,
}

impl User {
    fn info(&self) {
        println!("name: {}, age: {}, active: {}", self.name, self.age, self.active);
    }
}

关联函数

  • 关联函数通常用来作为构造器来构造一个实例化的对象

  • 关联函数的第一个参数不是self

  • 通过结构体名::函数名 的方式来调用关联函数

fn main() {
    let user = User::build(String::from("Zhangsan"), 18, true);
    user.info();
}

struct User {
    name: String,
    age: i32,
    active: bool,
}

impl User {
    fn build(name: String, age: i32, active: bool) -> User {
        User {
            name,
            age,
            active,
        }
    }

    fn info(&self) {
        println!("name: {}, age: {}, active: {}", self.name, self.age, self.active);
    }
}

0

评论区