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

目录

思维导图

[1. 结构体的定义与实例化](#1. 结构体的定义与实例化)

[1.1 结构体的基本概念](#1.1 结构体的基本概念)

[1.2 定义结构体](#1.2 定义结构体)

[1.3 创建结构体实例](#1.3 创建结构体实例)

[1.4 结构体的定义与实例化示例](#1.4 结构体的定义与实例化示例)

[2. 访问与修改结构体字段](#2. 访问与修改结构体字段)

[2.1 访问字段](#2.1 访问字段)

[2.2 修改字段](#2.2 修改字段)

[3. 结构体实例的构造函数](#3. 结构体实例的构造函数)

[3.1 构造函数的定义](#3.1 构造函数的定义)

[3.2 使用字段初始化简写](#3.2 使用字段初始化简写)

[4. 结构体更新语法](#4. 结构体更新语法)

[4.1 更新语法的使用](#4.1 更新语法的使用)

[5. 元组结构体](#5. 元组结构体)

[5.1 元组结构体的定义](#5.1 元组结构体的定义)

[6. 单元结构体](#6. 单元结构体)

[6.1 单元结构体的定义](#6.1 单元结构体的定义)

[7. 结构体数据的所有权](#7. 结构体数据的所有权)

[7.1 数据所有权的重要性](#7.1 数据所有权的重要性)


思维导图

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

1.1 结构体的基本概念

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

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

1.2 定义结构体

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

  • 在大括号内定义字段的名称和类型。字段的类型可以是Rust中的任意数据类型,包括基本类型、复合类型或其他结构体。例如:

    rust 复制代码
    struct User {
        active: bool,
        username: String,
        email: String,
        sign_in_count: u64,
    }

1.3 创建结构体实例

  • 创建结构体实例时,需要为每个字段指定具体值,可以不按照定义时的顺序。例如:

    rust 复制代码
    let user1 = User {
        active: true,
        username: String::from("someusername123"),[5]
        email: String::from("someone@example.com"),[5][6]
        sign_in_count: 1,
    };

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

rust 复制代码
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关键字声明),可以通过点表示法修改字段的值。例如:

    rust 复制代码
    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实例:

    rust 复制代码
    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 更新语法的使用

  • 结构体更新语法允许基于现有实例创建新实例,同时仅修改部分字段。例如:

    rust 复制代码
    let user2 = User {
        email: String::from("another@example.com"),[5]
        ..user1
    };
  • 在上述代码中,user2继承了user1的所有字段值,但email字段被更新为新值。

5. 元组结构体

5.1 元组结构体的定义

  • 元组结构体 是一种特殊的结构体,它没有命名字段,仅有字段类型。元组结构体适用于需要为整个元组命名的场景。例如:

    rust 复制代码
    struct Color(i32, i32, i32);[10]
    struct Point(i32, i32, i32);[10]
  • 元组结构体的实例可以通过索引访问字段,例如let black = Color(0, 0, 0);。

6. 单元结构体

6.1 单元结构体的定义

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

    rust 复制代码
    struct AlwaysEqual;
    
    fn main() {
        let subject = AlwaysEqual;
    }

7. 结构体数据的所有权

7.1 数据所有权的重要性

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

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

相关推荐
利刃大大18 分钟前
【C语言】内存函数详解与模拟实现
c语言·开发语言
siy23331 小时前
[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]
c语言·开发语言·笔记·学习·算法
疯狂的沙粒1 小时前
如何将一个数组转换为字符串?
开发语言·前端·javascript·柔性数组
啊晚1 小时前
ASP.NET Core - 配置系统之自定义配置提供程序
后端·asp.net
shix .1 小时前
python范围
开发语言·python
源之缘-OFD先行者1 小时前
FreeType 介绍及 C# 示例
开发语言·c#
惊鸿一梦q1 小时前
qt5Core.dll是什么文件,qt5Core.dll错误怎么办
开发语言·qt
程序员buddha2 小时前
华为OD上机考试真题(Java)——最长方连续方波信号
java·开发语言·华为od
听我一言2 小时前
Qt for android : 简单实现弹窗创建文件,并使用JNI进行读写实例
android·开发语言·qt