结构体

19 阅读2分钟

结构体概述

  • 结构体是复合数据类型,由不同数据类型的字段组合而成。
  • 结构体与元组相似,但字段具有命名,提高了数据的可读性和可用性。

结构体语法

定义结构体

struct User {
    active: bool,
    username: String,
    email: String,
    sign_in_count: u64,
}

创建结构体实例

let user1 = User {
    email: String::from("someone@example.com"),
    username: String::from("someusername123"),
    active: true,
    sign_in_count: 1,
};

访问结构体字段

let mut user1 = User {
    // ... 同上
};

user1.email = String::from("anotheremail@example.com");

简化结构体创建

  • 使用构建函数简化实例化过程。

构建函数示例

fn build_user(email: String, username: String) -> User {
    User {
        email,
        username,
        active: true,
        sign_in_count: 1,
    }
}

结构体更新语法

  • 根据现有实例创建新实例,仅修改不同字段。

结构体更新语法示例

let user2 = User {
    email: String::from("another@example.com"),
    ..user1
};

元组结构体

  • 字段没有名称的结构体,类似于元组。

元组结构体示例

struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);

单元结构体

  • 没有任何字段的结构体,关注行为而非内容。

单元结构体示例

struct AlwaysEqual;

impl SomeTrait for AlwaysEqual {
    // 实现特征方法
}

结构体数据的所有权

  • 结构体可以拥有数据,如使用 String 而非 &str

结构体引用示例

struct User {
    username: &str,
    email: &str,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let user1 = User {
        email: "someone@example.com",
        username: "someusername123",
        active: true,
        sign_in_count: 1,
    };
}

使用 #[derive(Debug)] 打印结构体信息

  • 通过派生 Debug 特征,使用 {:?} 格式化输出结构体。

打印结构体示例

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {:?}", rect1);
}

总结

  • 结构体是 Rust 中定义复杂数据类型的强大工具。
  • 结构体可以拥有数据,也可以借用数据,但借用需要处理生命周期问题。
  • 结构体的字段可以命名,提高了代码的可读性。
  • 可以使用派生特征 Debug 来简化结构体的打印输出。