Rust - 初识结构体

struct ,或者 structure ,是一个自定义数据类型,允许命名和包装多个相关的值,从而形成一个有意义的组合。如果你熟悉一门面向对象语言,struct 就像对象中的数据属性。

定义并实例化结构体

结构体和之前介绍过的元组类似,和元组一样,结构体的每一部分可以是不同类型。但不同于元组,结构体需要命名各部分数据以便能清楚的表明其值的意义。由于有了这些名字,结构体比元组更灵活:不需要依赖顺序来指定或访问实例中的值。

定义结构体需要使用struct关键字并给结构体提供一个名字,类似于变量名结构体的名字需要描述它所组合的数据的意义。然后在大括号中,定义每一部分数据的名字和类型,名字和类型之间用:分隔,我们称为 字段field ),不同字段之间用,隔开。如下代码示例:

rust 复制代码
// 定义结构体
struct UserInfo {
    name: String,
    age: i32,
    sex: bool,  // true表示男  false表示女
}

一旦定义了结构体,就可以通过为每个字段指定具体值来创建这个结构体的 实例,也就是实例化操作。

创建一个实例需要以结构体的名字开头,接着在大括号中使用 key: value 键-值对的形式提供字段,其中 key 是字段的名字,value 是需要存储在字段中的数据值。实例中字段的顺序不需要和它们在结构体中声明的顺序一致。换句话说,结构体的定义就像一个类型的通用模板,而实例则会在这个模板中放入特定数据来创建这个类型的值。比如下面的代码示例:

rust 复制代码
// 结构体实例化

let userinfo = UserInfo {
    name: String::from("rust"),
    age: 18,
    sex: true,
};

如果要从结构体中获取某个特定的值,可以使用点号。比如我们只想要用户的名字,可以使用userinfo.name,这个语法和python中的面向对象就非常类似了。

如果结构体的实例是可变的,并且想要修改结构体中的值,也可以使用点号给对应的字段重新赋值:

rust 复制代码
let userinfo = UserInfo {
    name: String::from("rust"),
    age: 18,
    sex: true,
};
// 修改实例的值
userinfo.age = 10;

需要注意的是整个实例必须是可变的;Rust 并不允许只将某个字段标记为可变。另外需要注意同其他任何表达式一样,我们可以在函数体的最后一个表达式中构造一个结构体的新实例,来隐式地返回这个实例。如下代码示例:

rust 复制代码
fn main() {
    let name = String::from("rust");
    let age = 20;
    let userinfo = build_userinfo(name, age);
    println!("user info name is {}", userinfo.name)
}

struct UserInfo {
    name: String,
    age: i32,
    sex: bool,  // true表示男  false表示女
}

fn build_userinfo(name: String, age: i32) ->UserInfo {
    UserInfo {
        name: name,
        age: age,
        sex: true,
    }  // 注意不能加分号哦,加上就会变成语句,返回值为空元组
}

为函数参数起与结构体字段相同的名字是可以理解的,但是重复 emailusername 字段名称与变量显得有些啰嗦。如果结构体有更多字段,开发人员就要哭了~~因此Rust提供了更加方便的简写语法。就是当函数参数和结构体的字段名称相同时,只需要写字段名即可,而不是字段名: 函数参数名

rust 复制代码
fn build_userinfo(name: String, age: i32) ->UserInfo {
    UserInfo {
        name,
        age,
        sex: true,
    }  // 注意不能加分号哦,加上就会变成语句,返回值为空元组
}

基于已有实例创建新的实例

基于已有实例创建新的实例在一些特定情况下可以帮助我们减少代码,可以通过结构体更新语法struct update syntax )实现。下面是一段示例代码,在不使用更新语法时,如何在 userinfo1 中创建一个新 UserInfo 实例。

rust 复制代码
let userinfo1  = UserInfo {
    name: String::from("rust"),
    age: user info.age,
    sex: userinfo.sex,
};

下面是使用结构体更新语法的代码示例,可以通过更少的代码实现相同的效果,..语法指定了剩余未显式设置值的字段应有与给定实例对应字段相同的值。

rust 复制代码
let userinfo1  = UserInfo {
    name: String::from("rust"),
    ..userinfo
};

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关推荐
地平线开发者5 分钟前
征程 6X | 常用工具介绍
算法·自动驾驶
闲人编程11 分钟前
Python第三方库IPFS-API使用详解:构建去中心化应用的完整指南
开发语言·python·去中心化·内存·寻址·存储·ipfs
地平线开发者22 分钟前
理想汽车智驾方案介绍 2|MindVLA 方案详解
算法·自动驾驶
艾莉丝努力练剑1 小时前
【C语言16天强化训练】从基础入门到进阶:Day 7
java·c语言·学习·算法
CTRA王大大1 小时前
【golang】制作linux环境+golang的Dockerfile | 如何下载golang镜像源
linux·开发语言·docker·golang
地平线开发者1 小时前
LLM 中评价指标与训练概要介绍
算法·自动驾驶
川石课堂软件测试2 小时前
技术干货|使用Prometheus+Grafana监控Tomcat实例详解
redis·功能测试·单元测试·tomcat·测试用例·grafana·prometheus
Ghost-Face2 小时前
关于并查集
算法
zhangfeng11332 小时前
以下是基于图论的归一化切割(Normalized Cut)图像分割工具的完整实现,结合Tkinter界面设计及Python代码示
开发语言·python·图论
flashlight_hi3 小时前
LeetCode 分类刷题:2529. 正整数和负整数的最大计数
python·算法·leetcode