当前位置: 首页 > news >正文

Rust(7):结构体类型

今天学习的内容是 Rust 中的结构体类型

结构体是一种用户自定义的数据类型,它是多种不同数据类型的组合。

结构体类型使用关键字 struct 声明,有三种类型的结构体:

  • 无字段的单元结构
  • 元组结构
  • 经典的 C 结构

结构体类型的命名采用大驼峰命名规则,下面看具体的介绍。

单元结构体(unit struct )

这种结构体类型没有字段定义,使用关键字 struct 进行声明,随后是其名称,并用分号作为结尾。比如:

struct Unit;
fn main() {
  let unit = Unit;
}  

这种结构体类型用的非常少。

元组结构体(tuple struct )

同样使用 struct 进行声明,后面跟类型名称,最后使用元组类型来定义结构体内容。比如:

struct Color(i32, i32, i32);

虽然没有显式的为结构体中的每个字段命名,但是一个元组结构体类型是具有明确的类型名称的。比如这个例子就声明了 Color 类型的元组结构体。

初始化一个元组结构体:

let color = Color(255, 255, 255);

元组结构体的访问,和元组类型一样,可以使用 . 语法,可以使用索引,可以使用模式匹配,比如:

println!("{}", color.0); // 255

类 C 结构体

使用 struct 声明,后面跟着结构体类型的名称,再后面使用一对大括号来声明该类型有哪些字段。比如声明一个 User 类型的结构体:

struct User {
    name: String,
    age: u32,
}

结构体中的每个字段使用 , 进行分隔,最后一个字段可以省略。

初始化一个 User 结构体实例:

let user = User {
    name: String::from('kw'),
    age: 18
}

访问结构体中的字段可以使用 . 运算符和模式匹配:

println!("名字:{}, 年龄:{}", user.name, user.age); // 名字:kw, 年龄:18

JSer 可以发现,这种类 C 结构体,非常像是 JS 中的普通对象。其实它们两者的意义也非常一致,就是能自定义更加复杂的数据类型,来应对更复杂的类型结构。

在 Rust 中,使用两个点 .. 来实现快速复用一个现成的结构体实例:

struct User {
  name: String,
  age: u32,
}

fn main() {
  let user1 = User {
    name: String::from("user1"),
    age: 18,
  };

  let user2 = User {
    name: String::from("user2"),
    ..user
  };


  println!("名字:{}, 年龄:{}", user2.name, user2.age); 
}

打印的结果是 名字:user2, 年龄:18 ,说明 user2name 是初始化时设置的值,并复用了 user1age 字段的值。

小结

Rust 中的结构体类型, 包括三类:单元结构体,元组结构体和类 C 结构体,其中类 C 结构体是使用最广泛的一种结构体类型。

相关文章:

  • 通信原理学习笔记6-3:数字解调——判决和误码率推导
  • Mybatis快速上手2——通用的CRUD操作
  • 基于Oracle数据库高校学生宿舍管理系统
  • 基于ACS40核心板的串口图传设计
  • Android移动应用开发之ListView和RecyclerView的简单使用
  • 探究linux进程调度
  • android新版本适配-android13最全适配方案
  • 【mongo 系列】聚合知识点梳理
  • 2022年9月26日--10月2日(ue4热更新视频教程为主)
  • 阿里云SLB负载均衡理论与操作
  • 【理论】(spark 二)spark core之RDD:基础概念、特点、stage任务划分与hello spark
  • JWT安全WebGoat实战与预编译CASE注入
  • 贝叶斯公式——假阳性问题
  • ES6-let-难点
  • 如何处理消费过程中的重复消息
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Docker 笔记(2):Dockerfile
  • Javascripit类型转换比较那点事儿,双等号(==)
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python语法速览与机器学习开发环境搭建
  • swift基础之_对象 实例方法 对象方法。
  • vue学习系列(二)vue-cli
  • 动态魔术使用DBMS_SQL
  • 复习Javascript专题(四):js中的深浅拷贝
  • 观察者模式实现非直接耦合
  • 区块链共识机制优缺点对比都是什么
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 我建了一个叫Hello World的项目
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​queue --- 一个同步的队列类​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (十五)使用Nexus创建Maven私服
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .gitignore
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET MVC之AOP
  • .net MySql
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore部署微服务(二)
  • .NET关于 跳过SSL中遇到的问题
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @KafkaListener注解详解(一)| 常用参数详解
  • @RequestMapping处理请求异常
  • [C/C++]数据结构 循环队列
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf
  • [IE编程] IE8 新增的C++开发接口
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [LeetCode]—Simplify Path 简化路径表达式