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,
    }  // 注意不能加分号哦,加上就会变成语句,返回值为空元组
}

为函数参数起与结构体字段相同的名字是可以理解的,但是重复 email 和 username 字段名称与变量显得有些啰嗦。如果结构体有更多字段,开发人员就要哭了~~因此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
};

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

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

相关推荐
爱笑的k1116 分钟前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm
拂拉氏26 分钟前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
X1A0RAN1 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
SomeOtherTime1 小时前
Rust 泛型与特性讲解(AI回答)
rust
熊猫钓鱼>_>3 小时前
普通用户视角的端侧智能体验手记【鸿蒙心迹】
开发语言·人工智能·华为·智能手机·性能优化·ai编程·harmonyos
瑞雪兆丰年兮3 小时前
JavaWeb-day13-SpringBootWeb事务管理&AOP
java·开发语言·springboot·javaweb·事务·web·aop
布莱克6054 小时前
Swift 常量详解:从 let 到编译期优化
服务器·开发语言·ssh·swift·常量·let
青川Lapis4 小时前
RUST:错误处理 thiserror + anyhow 工程化
rust
布莱克6055 小时前
Swift 可选类型(Optionals)详解:从原理到实战
开发语言·安全·ssh·swift·optional·可选类型
通信小呆呆5 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac