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 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
passer__jw7677 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾13 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序21 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
&岁月不待人&28 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove31 分钟前
G1垃圾回收器日志详解
java·开发语言
无尽的大道39 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒43 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
binishuaio1 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git