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
};

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

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

相关推荐
小_太_阳6 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it7 分钟前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎
古希腊掌管学习的神38 分钟前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca39 分钟前
洛谷 P1706 全排列问题 C语言
算法
古希腊掌管学习的神43 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师44 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
浊酒南街1 小时前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程1 小时前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
学术头条1 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存