当前位置: 首页 > article >正文

【Rust】结构体定义域实例化

目录

思维导图

1. 结构体的定义与实例化

1.1 结构体的基本概念

1.2 定义结构体

1.3 创建结构体实例

1.4 结构体的定义与实例化示例 

2. 访问与修改结构体字段

2.1 访问字段

2.2 修改字段

3. 结构体实例的构造函数

3.1 构造函数的定义

3.2 使用字段初始化简写

4. 结构体更新语法

4.1 更新语法的使用

5. 元组结构体

5.1 元组结构体的定义

6. 单元结构体

6.1 单元结构体的定义

7. 结构体数据的所有权

7.1 数据所有权的重要性


思维导图

1. 结构体的定义与实例化

1.1 结构体的基本概念

  • 结构体是一种自定义数据类型,允许将多个相关的值组合在一起,形成一个有意义的集合。与元组不同,结构体的每个字段都有名称,这使得数据的访问和操作更加直观和清晰。

  • 结构体的灵活性体现在其命名字段上,开发者无需依赖字段的顺序来访问数据,从而减少了错误的可能性。

1.2 定义结构体

  • 使用struct关键字定义结构体,并为其命名。结构体名称应具有描述性,能够清晰地表达其代表的含义。

  • 在大括号内定义字段的名称和类型。字段的类型可以是Rust中的任意数据类型,包括基本类型、复合类型或其他结构体。例如:
    struct User {
        active: bool,
        username: String,
        email: String,
        sign_in_count: u64,
    }
    

1.3 创建结构体实例

  • 创建结构体实例时,需要为每个字段指定具体值,可以不按照定义时的顺序。例如:
    let user1 = User {
        active: true,
        username: String::from("someusername123"),[5]
        email: String::from("someone@example.com"),[5][6]
        sign_in_count: 1,
    };
    

1.4 结构体的定义与实例化示例 

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

fn main() {
    // 创建结构体实例
    let user1 = User {
        active: true,
        username: String::from("someusername123"),
        email: String::from("someone@example.com"),
        sign_in_count: 1,
    };

    // 访问字段
    println!("User1: {}, {}, ({}), {}",
     user1.active, user1.username, user1.email, user1.sign_in_count);
}

2. 访问与修改结构体字段

2.1 访问字段

  • 使用点表示法(.)访问结构体实例的字段。例如,user1.email可以获取用户的电子邮件地址。

2.2 修改字段

  • 如果结构体实例是可变的(即使用mut关键字声明),可以通过点表示法修改字段的值。例如:
    struct User {
        active: bool,
        username: String,
        email: String,
        sign_in_count: u64,
    }
    
    fn main() {
        // 创建可变结构体实例
        let mut  user1 = User {
            active: true,
            username: String::from("someusername123"),
            email: String::from("someone@example.com"),
            sign_in_count: 1,
        };
        //修改字段
        user1.email = String::from("anotheremail@example.com");
    
        // 访问字段
        println!("updated User1: {}, {}, ({}), {}",
         user1.active, user1.username, user1.email, user1.sign_in_count);
    }

3. 结构体实例的构造函数

3.1 构造函数的定义

  • 可以定义一个函数来返回结构体实例,这种函数通常称为构造函数。例如,以下build_user函数用于创建User实例:
    struct User {
        active: bool,
        username: String,
        email: String,
        sign_in_count: u64,
    }
    
    fn main() {
        // 定义构造函数
        fn build_user(email: String, username: String) -> User {
            User {
                active: true,
                username,
                email,
                sign_in_count: 1,
            }
        }
    
        // 使用构造函数创建实例
        let user1 = build_user(
            String::from("someone@example.com"),
            String::from("someusername123"),
        );
    
        // 访问字段
        println!("User1: {}, {}, ({}), {}",
         user1.active, user1.username, user1.email, user1.sign_in_count);
    }

3.2 使用字段初始化简写

  • 当函数参数与结构体字段同名时,可以使用字段初始化简写语法,避免重复代码。例如,username: username可以简写为username

4. 结构体更新语法

4.1 更新语法的使用

  • 结构体更新语法允许基于现有实例创建新实例,同时仅修改部分字段。例如:
    let user2 = User {
        email: String::from("another@example.com"),[5]
        ..user1
    };
    
  • 在上述代码中,user2继承了user1的所有字段值,但email字段被更新为新值。

5. 元组结构体

5.1 元组结构体的定义

  • 元组结构体是一种特殊的结构体,它没有命名字段,仅有字段类型。元组结构体适用于需要为整个元组命名的场景。例如:
    struct Color(i32, i32, i32);[10]
    struct Point(i32, i32, i32);[10]
    
  • 元组结构体的实例可以通过索引访问字段,例如let black = Color(0, 0, 0);

6. 单元结构体

6.1 单元结构体的定义

  • 单元结构体是一种没有字段的结构体,类似于单元类型()。它通常用于实现某些特征(trait)而不需要存储数据。例如:
    struct AlwaysEqual;
    
    fn main() {
        let subject = AlwaysEqual;
    }

7. 结构体数据的所有权

7.1 数据所有权的重要性

  • 在结构体中使用拥有所有权的类型(如String)而非引用类型(如&str),可以确保每个结构体实例拥有其数据的所有权,从而避免生命周期管理的复杂性。

  • 如果需要在结构体中使用引用类型,则必须显式指定生命周期参数,以确保引用的有效性。这将在后续章节中详细讨论。


http://www.kler.cn/a/501129.html

相关文章:

  • STM32-笔记39-SPI-W25Q128
  • 机器学习数据预处理preprocessing
  • Kali系统(Debian 10.3) 遇到的问题
  • Nginx | 解决 Spring Boot 与 Nginx 中的 “413 Request Entity Too Large“ 错误
  • 系统思考—因果关系
  • Golang环境配置on Macbook Air M2
  • 安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?
  • 蓝桥杯历届真题 #分布式队列 (Java,C++)
  • 未来量子计算技术会如何影响音频DSP的发展?
  • 分布式光纤传感器行业:市场潜力巨大,技术革新引领未来
  • 【芯片封测学习专栏 -- D2D 和 C2C 之间的区别】
  • 义乌购的反爬虫机制怎么应对?
  • 音频数据增强:提升音频信号质量的多种技术
  • STM32Flash读写BUG,坑—————4字对齐
  • 《拉依达的嵌入式\驱动面试宝典》—操作系统篇(六)
  • Golang——rune和byte
  • 单片机实物成品-011 火灾监测
  • Python基础知识回顾-数据结构
  • Linux电源管理——Suspend-to-Idle(s2idle) 流程
  • mysql中创建计算字段
  • 网络原理(二)—— https
  • 使用 Python 实现自动化办公(邮件、Excel)
  • 支持向量机算法详解:从理论到实践
  • Redis 源码分析-内部数据结构 dict
  • acwing_5721_化学方程式配平